diff --git a/Credits.txt b/Credits.txt index c8081d33..c2e972b8 100644 --- a/Credits.txt +++ b/Credits.txt @@ -6,7 +6,7 @@ has been used throughout Invision Community to add style, flair and functionalit to our product. NULLING - Last Updated: 25 July 2017 + Last Updated: 18 April 2018 Author: IPBMafia.ru AES implementation in PHP @@ -22,17 +22,10 @@ BMDoHyeon font package Website: http://font.woowahan.com/dohyeon/ License: Open Font License -Buzz.js - Description: HTML5 audio support for notifications - Location: applications/core/interface/buzz - Included version: 1.2 - Website: http://buzz.jaysalvat.com/ - License: http://opensource.org/licenses/MIT - CKEditor Description: Provides the editor functionality for submitting content. Location: In development: applications/core/dev/ckeditor (custom build with additional plugins and some code changes) - Included version: 4.7.1 + Included version: 4.9 Website: http://ckeditor.com License: http://www.gnu.org/copyleft/lesser.html @@ -56,6 +49,13 @@ Devices Icon Pack Website: https://www.iconfinder.com/iconsets/devices-42 License: Free for commercial use +EmojiOne + Description: Emoji images + Location: Served from CDN + Included version: 3.1 + Website: https://www.emojione.com + License: https://d1j8pt39hxlh3d.cloudfront.net/license-free.pdf + FontAwesome Description: General icons for UI Location: Font files in applications/core/interface/font and CSS in development in applications/core/dev/css/global/framework/fonts.css (mixed with other CSS and modified to use correct path to font files) @@ -95,7 +95,14 @@ history.js Included version: 1.8b2 Website: https://github.com/browserstate/history.js License: https://github.com/browserstate/history.js#license - + +Howler + Description: HTML5 audio api + Location: applications/core/interface/howler + Included version: 2.0.9 + Website: https://github.com/goldfire/howler.js + License: http://opensource.org/licenses/MIT + HTML5shiv Description: Provides some HTML5 compatability for IE8 Location: applications/core/interface/html5shiv/html5shiv.js @@ -106,7 +113,7 @@ HTML5shiv HTMLPurifier Description: Validates and cleans submitted HTML for content Location: system/3rd_party/HTMLPurifier - Included version: 4.9.3 + Included version: 4.10.0 Website: http://htmlpurifier.org License: http://www.gnu.org/copyleft/lesser.html @@ -307,7 +314,14 @@ success.mp3 Notification Sound by RCP Tones Location: /applications/core/interface/sounds/success.mp3 Website: http://rcptones.com/dev_tones/ License: http://creativecommons.org/licenses/by/3.0/us/ - + +Twemoji + Description: Emoji images + Location: Served from CDN + Included version: 2.3 + Website: http://twitter.github.io/twemoji/ + License: https://github.com/twitter/twemoji/blob/gh-pages/LICENSE + Underscore.js Description: General-purpose functional JS library Location: dev/js/library/underscore/ @@ -315,13 +329,6 @@ Underscore.js Website: http://underscorejs.org License: https://github.com/documentcloud/underscore/blob/master/LICENSE -Video.js - Description: HTML5 video player for Gallery - Location: applications/interface/videojs - Included version: 5.19.2 - Website: http://www.videojs.com/ - License: https://github.com/videojs/video.js/blob/master/LICENSE - Whoops Description: Provides error handling for development mode Location: dev/Whoops @@ -341,4 +348,11 @@ XRegExp (with addons) Location: In development: dev/js/library/xregexp/xregexp-all.js Included Version: 3.2.0 Website: http://xregexp.com + License: http://mit-license.org + +Hammer.js + Description: Provides touch and gesture javascript event support + Location: dev/js/library/hammer + Included Version: 2.0.8 + Website: http://hammerjs.github.io License: http://mit-license.org \ No newline at end of file diff --git a/admin/convertutf8/init.php b/admin/convertutf8/init.php index e8dfe29e..f39a5028 100644 --- a/admin/convertutf8/init.php +++ b/admin/convertutf8/init.php @@ -95,7 +95,8 @@ class IPSUtf8 */ public static function errorHandler( $errno, $errstr, $errfile, $errline, $trace=NULL ) { - if ( in_array( $errno, array( E_NOTICE ) ) ) + /* We don't care about these in production */ + if ( in_array( $errno, array( E_WARNING, E_NOTICE, E_STRICT, E_DEPRECATED ) ) ) { return; } @@ -246,4 +247,11 @@ class IPSUtf8 /* Init */ IPSUtf8::init(); - +/* Custom mb_ucfirst() function - eval'd so we can put into global namespace */ +eval( ' +function mb_ucfirst() +{ + $text = func_get_arg( 0 ); + return mb_strtoupper( mb_substr( $text, 0, 1 ) ) . mb_substr( $text, 1 ); +} +'); \ No newline at end of file diff --git a/admin/convertutf8/system/Convert/Convert.php b/admin/convertutf8/system/Convert/Convert.php index 5040904d..00ea8aaa 100644 --- a/admin/convertutf8/system/Convert/Convert.php +++ b/admin/convertutf8/system/Convert/Convert.php @@ -995,7 +995,7 @@ class Convert { foreach( $tableData['definition']['indexes'] as $key => $index ) { - if ( $index['type'] === 'unique' ) + if ( $index['type'] === 'unique' OR $index['type'] === 'primary' ) { /* Make sure none of the columns in this index are auto_increment */ foreach( $index['columns'] AS $k => $idxcol ) @@ -1030,7 +1030,9 @@ class Convert /* Did not work - try the long way */ static::$utf->query( "RENAME TABLE `" . static::$db->prefix . $name . "` TO `" . static::$db->prefix . $name . "_temp`" ); static::log( $name . " has Unique Index - temp table created from main." ); - static::$utf->query( "CREATE TABLE `" . static::$db->prefix . $name . "` LIKE `" . static::$db->prefix . $name . "_temp`" ); + /* Previously we used a raw create table query to create a copy, however this does not check index lengths. Leaving this for reference. */ + //static::$utf->query( "CREATE TABLE `" . static::$db->prefix . $name . "` LIKE `" . static::$db->prefix . $name . "_temp`" ); + static::$db->createTable( $this->checkTable( $tableData['definition'] ) ); static::$utf->query( "ALTER TABLE `" . static::$db->prefix . $name . "` CONVERT TO CHARACTER SET " . $charset . " COLLATE " . $collation ); static::$utf->query( "ALTER TABLE `" . static::$db->prefix . $name . "` DEFAULT CHARACTER SET " . $charset . " COLLATE " . $collation ); static::log( $name . " created from temp table." ); @@ -1280,7 +1282,7 @@ class Convert /* MB4? */ $sessionData = \IPSUtf8\Session::i()->json; $length = 0; - $multiplier = ( ! empty( $sessionData['use_utf8mb4'] ) ) ? 4 : 3; + $multiplier = 4; $needsFixing = array(); $maxLen = 1000; @@ -1293,30 +1295,44 @@ class Convert { foreach( $definition['indexes'] as $key => $index ) { + $thisLength = null; + $hasText = false; + foreach( $index['columns'] as $i => $column ) { - if ( isset( $definition['columns'][ $column ] ) and ( ( ! empty( $definition['columns'][ $column ]['length'] ) or in_array( mb_strtolower( $definition['columns'][ $column ]['type'] ), array( 'longtext', 'mediumtext', 'text' ) ) ) ) ) + $thisLength = ( isset( $index['length'][ $i ] ) ) ? $index['length'][ $i ] : ( ( (int) $definition['columns'][ $column ]['length'] or empty( $definition['columns'][ $column ]['length'] ) ) ? $definition['columns'][ $column ]['length'] : 250 ); + + $isText = in_array( mb_strtolower( $definition['columns'][ $column ]['type'] ), array( 'mediumtext', 'text' ) ); + + if ( $hasText === false and $isText === true ) { - $length += (int) ( $definition['columns'][ $column ]['length'] ) ? $definition['columns'][ $column ]['length'] : 250; + $hasText = true; + } + + if ( isset( $definition['columns'][ $column ] ) and ( ( ! empty( $thisLength ) or $isText ) ) ) + { + $length += $thisLength; } } - - if ( $length * $multiplier > $maxLen ) + + if ( ( $length * $multiplier > $maxLen ) or $hasText ) { foreach( $index['columns'] as $i => $column ) { - if ( isset( $definition['columns'][ $column ] ) and ( ( ! empty( $definition['columns'][ $column ]['length'] ) or in_array( mb_strtolower( $definition['columns'][ $column ]['type'] ), array( 'longtext', 'mediumtext', 'text' ) ) ) ) ) + $thisLength = ( isset( $index['length'][ $i ] ) ) ? $index['length'][ $i ] : ( (int) $definition['columns'][ $column ]['length'] ? $definition['columns'][ $column ]['length'] : 250 ); + + if ( isset( $definition['columns'][ $column ] ) and ( ( ! empty( $thisLength ) or in_array( mb_strtolower( $definition['columns'][ $column ]['type'] ), array( 'mediumtext', 'text' ) ) ) ) ) { /* Column name, column length, column type */ - $needsFixing[ $key ][ $i ] = array( $column, ( (int) $definition['columns'][ $column ]['length'] ) ? $definition['columns'][ $column ]['length'] : 250, $definition['columns'][ $column ]['type'] ); + $needsFixing[ $key ][ $i ] = array( $column, $thisLength, $definition['columns'][ $column ]['type'] ); } } } - + $length = 0; } } - + if ( count( $needsFixing ) ) { foreach( $needsFixing as $key => $i ) @@ -1334,21 +1350,23 @@ class Convert /* Check each column can be reduced by the amount we need reducing */ $debt = 0; - $reduceEachBy = ( ( 100 / $totalLength ) * $maxChars ) / 100; - + $reduceEachBy = ( ( 100 / $totalLength ) * $maxChars) / 100; + /* Apply debt if we have any. We do not reduce integers */ foreach( $i as $x => $vals ) { - if ( array_key_exists( mb_strtolower( $vals[2] ), static::$numericCols ) AND static::$numericCols[ mb_strtolower( $vals[2] ) ] !== NULL ) + if ( in_array( mb_strtoupper( $vals[2] ), array_keys( static::$numericCols ) ) ) { - /* Don't go by "display" space, go by storage space, which is static regardless of supplied value ... an INT(4) still uses 11 chars */ - $debt += static::$numericCols[ mb_strtolower( $vals[2] ) ]; + $debt += $vals[1]; } } /* Recalculate value to multiply index sub lengths with (subtracting debt) */ - $reduceEachBy = ( ( 100 / ( $totalLength - $debt ) ) * ( $maxChars - $debt ) ) / 100; - + if ( $debt < $totalLength ) + { + $reduceEachBy = ( ( 100 / ($totalLength - $debt) ) * ( $maxChars - $debt ) ) / 100; + } + foreach( $i as $x => $vals ) { /* No length? */ @@ -1357,9 +1375,16 @@ class Convert $vals[1] = 250; } - if ( array_key_exists( mb_strtolower( $vals[2] ), static::$numericCols ) AND static::$numericCols[ mb_strtolower( $vals[2] ) ] !== NULL ) + if ( in_array( mb_strtoupper( $vals[2] ), array_keys( static::$numericCols ) ) ) { - /* Preserve col len */ + /* Preserve col len where possible but if the column length is greater than subpart allowed, NULL the length + otherwise MySQL will complain as you cannot use subpart on non-string column. */ + if ( $vals[1] > floor( $maxLen / $multiplier ) ) + { + $vals[1] = NULL; + $i[ $x ] = $vals; + } + continue; } @@ -1370,9 +1395,13 @@ class Convert foreach( $i as $x => $vals ) { - if ( $definition['columns'][ $definition['indexes'][ $key ]['columns'][ $x ] ]['length'] != $vals[1] ) + if ( in_array( mb_strtolower( $vals[2] ), static::$convertCols ) AND $definition['columns'][ $definition['indexes'][ $key ]['columns'][ $x ] ]['length'] != $vals[1] ) { - $definition['indexes'][ $key ]['length'][ $x ] = $vals[1]; + $definition['indexes'][ $key ]['length'][ $x ] = intval( $vals[1] ); + } + else + { + $definition['indexes'][ $key ]['length'][ $x ] = NULL; } } } diff --git a/admin/convertutf8/system/Text/Charset.php b/admin/convertutf8/system/Text/Charset.php index 703a0459..08eef5b0 100644 --- a/admin/convertutf8/system/Text/Charset.php +++ b/admin/convertutf8/system/Text/Charset.php @@ -74,7 +74,7 @@ abstract class Charset } } - self::$method = ucfirst( self::$method ); + self::$method = mb_ucfirst( self::$method ); if ( ! isset( static::$multitons[ self::$method ] ) ) { diff --git a/admin/index.php b/admin/index.php index 5e72b753..54f65fa5 100644 --- a/admin/index.php +++ b/admin/index.php @@ -9,5 +9,6 @@ */ define('READ_WRITE_SEPARATION', FALSE); +define('REPORT_EXCEPTIONS', TRUE); require_once '../init.php'; \IPS\Dispatcher\Admin::i()->run(); \ No newline at end of file diff --git a/admin/install/emoticons/data.json b/admin/install/emoticons/data.json index de3cb73f..080014c0 100644 --- a/admin/install/emoticons/data.json +++ b/admin/install/emoticons/data.json @@ -1,85 +1,85 @@ { - ">:(": { + ":classic_angry:": { "image": "angry.png", "image_2x": "angry@2x.png" }, - ":D": { + ":classic_biggrin:": { "image": "biggrin.png", "image_2x": "biggrin@2x.png" }, - "O.o": { + ":classic_blink:": { "image": "blink.png", "image_2x": "blink@2x.png" }, - ":$": { + ":classic_blush:": { "image": "blush.png", "image_2x": "blush@2x.png" }, - "B|": { + ":classic_cool:": { "image": "cool.png", "image_2x": "cool@2x.png" }, - "¬¬": { + ":classic_dry:": { "image": "dry.png", "image_2x": "dry@2x.png" }, - "^_^": { + ":classic_happy:": { "image": "happy.png", "image_2x": "happy@2x.png" }, - "o.O": { + ":classic_huh:": { "image": "huh.png", "image_2x": "huh@2x.png" }, - "xD": { + ":classic_laugh:": { "image": "laugh.png", "image_2x": "laugh@2x.png" }, - ":|": { + ":classic_mellow:": { "image": "mellow.png", "image_2x": "mellow@2x.png" }, - ":o": { + ":classic_ohmy:": { "image": "ohmy.png", "image_2x": "ohmy@2x.png" }, - ":ph34r:": { + ":classic_ninja:": { "image": "ph34r.png", "image_2x": "ph34r@2x.png" }, - "9_9": { + ":classic_rolleyes:": { "image": "rolleyes.gif", "image_2x": "rolleyes@2x.png" }, - ":(": { + ":classic_sad:": { "image": "sad.png", "image_2x": "sad@2x.png" }, - "-_-": { + ":classic_sleep:": { "image": "sleep.png", "image_2x": "sleep@2x.png" }, - ":)": { + ":classic_smile:": { "image": "smile.png", "image_2x": "smile@2x.png" }, - ":P": { + ":classic_tongue:": { "image": "tongue.png", "image_2x": "tongue@2x.png" }, - ":/": { + ":classic_unsure:": { "image": "unsure.png", "image_2x": "unsure@2x.png" }, - ":S": { + ":classic_wacko:": { "image": "wacko.png", "image_2x": "wacko@2x.png" }, - ";)": { + ":classic_wink:": { "image": "wink.png", "image_2x": "wink@2x.png" }, - ":x": { + ":classic_love:": { "image": "wub.png", "image_2x": "wub@2x.png" } diff --git a/admin/install/emoticons/rolleyes.gif b/admin/install/emoticons/rolleyes.gif index def8a49d..73368922 100644 Binary files a/admin/install/emoticons/rolleyes.gif and b/admin/install/emoticons/rolleyes.gif differ diff --git a/admin/install/emoticons/sleep.png b/admin/install/emoticons/sleep.png index c9b00808..599ab3a7 100644 Binary files a/admin/install/emoticons/sleep.png and b/admin/install/emoticons/sleep.png differ diff --git a/admin/install/eula.txt b/admin/install/eula.txt index 4755f467..1e3fd974 100644 --- a/admin/install/eula.txt +++ b/admin/install/eula.txt @@ -1 +1 @@ -=============================[NOTE]============================= This software is Nulled! Nulled by IPBMafia.ru Buy license at https://www.invisionpower.com/buy/self-hosted ================================================================ IPS 4.2.0 Release (102002) =============================[NOTE]============================= Invision Community End User License Agreement 1. Acceptance This software license agreement (the “Agreement”) is between you (either an individual or entity, hereinafter referred to as “You” or “Your”) and Invision Power Services, Inc. (“IPS”, “We”, “Our” or “Us”) and pertains to the Invision Community software, its components, features, enhancements, updates and modifications (collectively the “Software” or “Suite”) and any related services (“Services”) provided by IPS under this Agreement. By purchasing, downloading, accessing, installing, facilitating the installation or using the Software or Services (or allowing or authorizing any other person to do so) you are warranting that you have the authority provided by your state, country or jurisdiction to enter into a legally binding contract and that you have read and agree to be bound by the terms of this Agreement. You understand and acknowledge that this Agreement comprises the entire agreement between You and IPS. This Agreement supersedes any prior agreements, promises, representations or descriptions. If you do not agree with the terms and conditions set forth hereinafter, you may not purchase, download, access, install or use the Software or Services. This Agreement may only be modified in writing, signed by an officer of IPS and You. 2. License Scope and Grant In consideration for payment of all applicable license fees and subject to the terms and conditions of this Agreement, IPS grants you a revocable, limited and non-exclusive license to install and use the Software and Services on a single installation, accessible via one URL. Access to services, components, software updates and technical support require an active license. All rights in and to the Software and Services are reserved to the use and benefit of IPS and/or its licensors, successors and assigners. (a) Test Installation. You may install and test one additional instance of the Software for the purpose of development and testing. This installation must be and remain isolated and inaccessible to the general public at all times. 3. Restrictions Your license to use the Software and Services is subject to the following terms, conditions and restrictions on use: (a) You may alter and modify the Software’s source code for Your use, subject to this Agreement, however, you may not distribute, publish, resell, or otherwise share the Software or derivative works based on the Software without prior express written consent from IPS. (b) You may not utilize the Software or Services to engage in, facilitate, or otherwise allow others to engage in any activity that violates any law or regulation or the terms and conditions within this Agreement. (c) You are solely responsible for complying with all governmental regulations and policies. You agree to indemnify Us from any loss, action or damage arising from Your failure to use the Software in a manner inconsistent with applicable legislation. (d) You may not remove any copyright or proprietary notices on or within the software’s source code at any time. A copyright removal license may be purchased to remove the public display of the Software’s publicly displayed copyright notice. 4. Intellectual Property We have the sole and exclusive right to the Software which is being licensed, not sold, to you by IPS under the terms and conditions of this agreement. The Software is protected by copyright, trademark and other intellectual property laws. IPS reserves any rights not expressly granted herein. 5. Assignment You may not rent, lease, sell, share or authorize or temporarily assign your rights to the license or this Agreement to another individual or entity except as expressly permitted herein. (a) You may, after six months from the original purchase date, permanently transfer your licensing rights and interest in this Agreement to a third party, provided the license is active and in good standing. Any transfer and reassignment must occur via the mechanisms provided within the invisioncommunity.com client area and all applicable fees must be paid for the reassignment to be considered valid. (b) You agree to provide this Agreement in its entirety to the assignee prior to reassignment and the assignee must agree to be bound to the terms of this Agreement. (c) You acknowledge that account and non license specific materials and purchases, including, but not limited to: account credits and third party (“marketplace”) add-ons and purchases are non-transferrable under any circumstances. (d) We reserve the right to refuse or reject reassignment at our sole discretion. 6. Termination This Agreement shall remain in effect until terminated. Your rights under this Agreement will automatically terminate without notice from Us in the event you fail to comply with any term or condition within this Agreement. Upon termination of this Agreement, you shall immediately cease all use of the Software and destroy all copies, full or partial, of the Software that may be in your possession or otherwise under your control. 7. Modification We reserve the right to amend or modify the terms of this Agreement at any time, and to change, discontinue or impose conditions on any aspect of the Software or related Service and to provide notification solely by posting an updated version of the Agreement on the invisioncommunity.com website. You acknowledge that you are solely responsible for regularly reviewing this Agreement and our policies. Continued use of the Software after modification to the Agreement constitutes your binding consent to such changes. 8. Disclaimer of Warranty THE SOFTWARE IS PROVIDED “AS-IS” AND TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, WE DISCLAIM ALL OTHER WARRANTIES, CONDITIONS, REPRESENTATIONS OR TERMS, EXPRESS OR IMPLIED, BY STATUTE, COMMON LAW, USAGE OR OTHERWISE, REGARDING THE SOFTWARE AND ANY RELATED SERVICES, INCLUDING THEIR FITNESS FOR A PARTICULAR PURPOSE, THEIR QUALITY, THEIR MERCHANTABILITY, OR THEIR NON-INFRINGEMENT. WE DO NOT WARRANT THAT THE SOFTWARE OR ANY RELATED SERVICES IS SECURE, OR IS FREE FROM BUGS, VIRUSES, ERRORS, OR OTHER PROGRAM LIMITATIONS, OR THAT DEFECTS WILL BE CORRECTED. SOME JURISDICTIONS DO NOT ALLOW EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSIONS MAY NOT APPLY TO YOU. THE ENTIRE RISK AS TO THE RESULTS, QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU FROM US OR OUR EMPLOYEES, REPRESENTATIVE OR AGENTS OR THROUGH OR FROM THE SOFTWARE OR OUR WEBSITE SHALL CREATE ANY WARRANTY NOT EXPRESSLY STATED WITHIN. THIS SECTION WILL SURVIVE THE TERMINATION OF THIS AGREEMENT. 9. Limitation of Liability TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL WE, OUR SUBSIDIARIES, OFFICERS, DIRECTORS, SHAREHOLDERS, PARTNERS, EMPLOYEES, AGENTS, CONTRACTORS OR OUR SUCCESSORS BE LIABLE FOR ANY DAMAGES WHATSOEVER, INCLUDING, BUT NOT LIMITED TO PERSONAL INJURY OR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, EXEMPLARY, PUNITIVE, COVER, CONSEQUENTIAL OR OTHER DAMAGES, INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, LOSS OF DATA, LOSS OF USE, COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, LOSS OF GOODWILL OR ANY OTHER COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO THE USE OF, OR INABILITY TO USE, THE SOFTWARE OR ANY RELATED SERVICES OR CONTENT, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND EVEN IF A REMEDY SET FORTH HEREIN IS FOUND TO HAVE FAILED OF ITS ESSENTIAL PURPOSE. WITHOUT LIMITING THE FOREGOING, IN NO EVENT SHALL OUR TOTAL LIABILITY TO YOU FOR ACTUAL DAMAGES FOR ANY CAUSE WHATSOEVER EXCEED THE AMOUNT PAID BY YOU TO LICENSE THE SOFTWARE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE FOREGOING LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU. THESE LIMITATIONS WILL SURVIVE THE TERMINATION OF THIS AGREEMENT. 10. Indemnification You agree to fully indemnify and hold us, our successors, officers, directors, shareholders, partners, employees, agents, contracts and our successors harmless from and against any claim, suit, hearing, action, expense or demand, including without limitation to: all claims for damages, fees or costs (including attorneys’ fees), arising out of or related to the use of the Software and/or any related Services by you, your agents or representatives, anyone under your control, or by any third party using your equipment or accounts to use the Software or Services (for purposes of this section, collectively, “you”); the violation by you of any provision of this Agreement; the violation by you and any laws or regulations; or the infringement or misappropriation by you any copyright, trademark or any other intellectual property right, proprietary right, property right or any other right of ours or any third party. We reserve the right to assume the exclusive defense and control of any matter otherwise subject to indemnification by you, in which event you will cooperate with us in asserting any available defenses and, as set forth above, be fully responsible for our attorneys’ fees. 11. Governing Law The license and this Agreement are governed by and construed in accordance with the laws of the State of Virginia, United States of America. You hereby consent to exclusive jurisdiction and venue in the County of Bedford and State of Virginia. By agreeing to the terms of this Agreement, you are waiving any claims that you might otherwise have against IPS based on the laws of other jurisdictions. 12. Severability If, for any reason, a court of competent jurisdiction deems any provision or part of this Agreement to be unlawful or unenforceable, the remainder of the Agreement shall remain in full force and effect. \ No newline at end of file +=============================[NOTE]============================= This software is Nulled! Nulled by IPBMafia.ru Buy license at https://www.invisionpower.com/buy/self-hosted ================================================================ IPS 4.3.0 Release (103005) =============================[NOTE]============================= Invision Community End User License Agreement 1. Acceptance This software license agreement (the “Agreement”) is between you (either an individual or entity, hereinafter referred to as “You” or “Your”) and Invision Power Services, Inc. (“IPS”, “We”, “Our” or “Us”) and pertains to the Invision Community software, its components, features, enhancements, updates and modifications (collectively the “Software” or “Suite”) and any related services (“Services”) provided by IPS under this Agreement. By purchasing, downloading, accessing, installing, facilitating the installation or using the Software or Services (or allowing or authorizing any other person to do so) you are warranting that you have the authority provided by your state, country or jurisdiction to enter into a legally binding contract and that you have read and agree to be bound by the terms of this Agreement. You understand and acknowledge that this Agreement comprises the entire agreement between You and IPS. This Agreement supersedes any prior agreements, promises, representations or descriptions. If you do not agree with the terms and conditions set forth hereinafter, you may not purchase, download, access, install or use the Software or Services. This Agreement may only be modified in writing, signed by an officer of IPS and You. 2. License Scope and Grant In consideration for payment of all applicable license fees and subject to the terms and conditions of this Agreement, IPS grants you a revocable, limited and non-exclusive license to install and use the Software and Services on a single installation, accessible via one URL. Access to services, components, software updates and technical support require an active license. All rights in and to the Software and Services are reserved to the use and benefit of IPS and/or its licensors, successors and assigners. (a) Test Installation. You may install and test one additional instance of the Software for the purpose of development and testing. This installation must be and remain isolated and inaccessible to the general public at all times. 3. Restrictions Your license to use the Software and Services is subject to the following terms, conditions and restrictions on use: (a) You may alter and modify the Software’s source code for Your use, subject to this Agreement, however, you may not distribute, publish, resell, or otherwise share the Software or derivative works based on the Software without prior express written consent from IPS. (b) You may not utilize the Software or Services to engage in, facilitate, or otherwise allow others to engage in any activity that violates any law or regulation or the terms and conditions within this Agreement. (c) You are solely responsible for complying with all governmental regulations and policies. You agree to indemnify Us from any loss, action or damage arising from Your failure to use the Software in a manner inconsistent with applicable legislation. (d) You may not remove any copyright or proprietary notices on or within the software’s source code at any time. A copyright removal license may be purchased to remove the public display of the Software’s publicly displayed copyright notice. 4. Intellectual Property We have the sole and exclusive right to the Software which is being licensed, not sold, to you by IPS under the terms and conditions of this agreement. The Software is protected by copyright, trademark and other intellectual property laws. IPS reserves any rights not expressly granted herein. 5. Assignment You may not rent, lease, sell, share or authorize or temporarily assign your rights to the license or this Agreement to another individual or entity except as expressly permitted herein. (a) You may, after six months from the original purchase date, permanently transfer your licensing rights and interest in this Agreement to a third party, provided the license is active and in good standing. Any transfer and reassignment must occur via the mechanisms provided within the invisioncommunity.com client area and all applicable fees must be paid for the reassignment to be considered valid. (b) You agree to provide this Agreement in its entirety to the assignee prior to reassignment and the assignee must agree to be bound to the terms of this Agreement. (c) You acknowledge that account and non license specific materials and purchases, including, but not limited to: account credits and third party (“marketplace”) add-ons and purchases are non-transferrable under any circumstances. (d) We reserve the right to refuse or reject reassignment at our sole discretion. 6. Termination This Agreement shall remain in effect until terminated. Your rights under this Agreement will automatically terminate without notice from Us in the event you fail to comply with any term or condition within this Agreement. Upon termination of this Agreement, you shall immediately cease all use of the Software and destroy all copies, full or partial, of the Software that may be in your possession or otherwise under your control. 7. Modification We reserve the right to amend or modify the terms of this Agreement at any time, and to change, discontinue or impose conditions on any aspect of the Software or related Service and to provide notification solely by posting an updated version of the Agreement on the invisioncommunity.com website. You acknowledge that you are solely responsible for regularly reviewing this Agreement and our policies. Continued use of the Software after modification to the Agreement constitutes your binding consent to such changes. 8. Disclaimer of Warranty THE SOFTWARE IS PROVIDED “AS-IS” AND TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, WE DISCLAIM ALL OTHER WARRANTIES, CONDITIONS, REPRESENTATIONS OR TERMS, EXPRESS OR IMPLIED, BY STATUTE, COMMON LAW, USAGE OR OTHERWISE, REGARDING THE SOFTWARE AND ANY RELATED SERVICES, INCLUDING THEIR FITNESS FOR A PARTICULAR PURPOSE, THEIR QUALITY, THEIR MERCHANTABILITY, OR THEIR NON-INFRINGEMENT. WE DO NOT WARRANT THAT THE SOFTWARE OR ANY RELATED SERVICES IS SECURE, OR IS FREE FROM BUGS, VIRUSES, ERRORS, OR OTHER PROGRAM LIMITATIONS, OR THAT DEFECTS WILL BE CORRECTED. SOME JURISDICTIONS DO NOT ALLOW EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSIONS MAY NOT APPLY TO YOU. THE ENTIRE RISK AS TO THE RESULTS, QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU FROM US OR OUR EMPLOYEES, REPRESENTATIVE OR AGENTS OR THROUGH OR FROM THE SOFTWARE OR OUR WEBSITE SHALL CREATE ANY WARRANTY NOT EXPRESSLY STATED WITHIN. THIS SECTION WILL SURVIVE THE TERMINATION OF THIS AGREEMENT. 9. Limitation of Liability TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL WE, OUR SUBSIDIARIES, OFFICERS, DIRECTORS, SHAREHOLDERS, PARTNERS, EMPLOYEES, AGENTS, CONTRACTORS OR OUR SUCCESSORS BE LIABLE FOR ANY DAMAGES WHATSOEVER, INCLUDING, BUT NOT LIMITED TO PERSONAL INJURY OR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, EXEMPLARY, PUNITIVE, COVER, CONSEQUENTIAL OR OTHER DAMAGES, INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, LOSS OF DATA, LOSS OF USE, COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, LOSS OF GOODWILL OR ANY OTHER COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO THE USE OF, OR INABILITY TO USE, THE SOFTWARE OR ANY RELATED SERVICES OR CONTENT, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND EVEN IF A REMEDY SET FORTH HEREIN IS FOUND TO HAVE FAILED OF ITS ESSENTIAL PURPOSE. WITHOUT LIMITING THE FOREGOING, IN NO EVENT SHALL OUR TOTAL LIABILITY TO YOU FOR ACTUAL DAMAGES FOR ANY CAUSE WHATSOEVER EXCEED THE AMOUNT PAID BY YOU TO LICENSE THE SOFTWARE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE FOREGOING LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU. THESE LIMITATIONS WILL SURVIVE THE TERMINATION OF THIS AGREEMENT. 10. Indemnification You agree to fully indemnify and hold us, our successors, officers, directors, shareholders, partners, employees, agents, contracts and our successors harmless from and against any claim, suit, hearing, action, expense or demand, including without limitation to: all claims for damages, fees or costs (including attorneys’ fees), arising out of or related to the use of the Software and/or any related Services by you, your agents or representatives, anyone under your control, or by any third party using your equipment or accounts to use the Software or Services (for purposes of this section, collectively, “you”); the violation by you of any provision of this Agreement; the violation by you and any laws or regulations; or the infringement or misappropriation by you any copyright, trademark or any other intellectual property right, proprietary right, property right or any other right of ours or any third party. We reserve the right to assume the exclusive defense and control of any matter otherwise subject to indemnification by you, in which event you will cooperate with us in asserting any available defenses and, as set forth above, be fully responsible for our attorneys’ fees. 11. Governing Law The license and this Agreement are governed by and construed in accordance with the laws of the State of Virginia, United States of America. You hereby consent to exclusive jurisdiction and venue in the County of Bedford and State of Virginia. By agreeing to the terms of this Agreement, you are waiving any claims that you might otherwise have against IPS based on the laws of other jurisdictions. 12. Severability If, for any reason, a court of competent jurisdiction deems any provision or part of this Agreement to be unlawful or unenforceable, the remainder of the Agreement shall remain in full force and effect. \ No newline at end of file diff --git a/admin/install/html/forms/template.phtml b/admin/install/html/forms/template.phtml index d5fd3652..70aa331f 100644 --- a/admin/install/html/forms/template.phtml +++ b/admin/install/html/forms/template.phtml @@ -12,7 +12,7 @@ {{endforeach}} {{if $uploadField}} - + {{endif}} {{if $error}}
diff --git a/admin/install/html/global/blankTemplate.phtml b/admin/install/html/global/blankTemplate.phtml new file mode 100644 index 00000000..8f5ab0d6 --- /dev/null +++ b/admin/install/html/global/blankTemplate.phtml @@ -0,0 +1,25 @@ + + + + + {$title} + + + + + + + + + + + + + + + + {$html|raw} + + \ No newline at end of file diff --git a/admin/install/html/global/globalTemplate.phtml b/admin/install/html/global/globalTemplate.phtml index 3a3419f0..b7b70f59 100644 --- a/admin/install/html/global/globalTemplate.phtml +++ b/admin/install/html/global/globalTemplate.phtml @@ -70,7 +70,7 @@ {lang="gotosuite"} {lang="gotoacp"}

- Russian lang pack + Russian lang pack

{lang="docs_link"}
diff --git a/admin/install/index.php b/admin/install/index.php index 5a824b9f..41ffe63b 100644 --- a/admin/install/index.php +++ b/admin/install/index.php @@ -9,5 +9,6 @@ */ define('READ_WRITE_SEPARATION', FALSE); +define('REPORT_EXCEPTIONS', TRUE); require_once '../../init.php'; \IPS\Dispatcher\Setup::i()->setLocation('install')->run(); \ No newline at end of file diff --git a/admin/install/lang.php b/admin/install/lang.php index 54a88ebb..21d9eaf9 100644 --- a/admin/install/lang.php +++ b/admin/install/lang.php @@ -19,6 +19,7 @@ $lang = array( 'generic_error' => "An unknown error occurred", 'installation_error' => "Installation Error", 'installer_locked' => "Installer Locked.", + 'session_no_good' => "We were unable to start a PHP session. You will need to contact your host to adjust your PHP configuration before you can continue. The error reported was: %s", 'error' => "Error", 'error_title' => "Error", 'page_doesnt_exist' => "That page doesn't exist.", @@ -68,6 +69,7 @@ $lang = array( 'requirements_suhosin_cookie_encrypt' => "PHP setting suhosin.cookie.encrypt is set to 1. This can cause problems in some areas such as the editor's auto save functionality. We recommended a value of 0 to disable it.", 'requirements_file_system' => "File System", 'requirements_file_writable' => "%s is writable", + 'requirements_mysql_timeout' => "Your MySQL %s system variable is currently set to an extremely low value (%s). The default MySQL value is 28800. It is recommended to increase this MySQL system variable to at least 20 in order to prevent potential problems with queries timing out.", 'dir_does_not_exist' => "%s does not exist.", 'dir_is_not_writable' => "%s cannot be written to. Please adjust the permissions on it or contact your hosting provider for assistance.", 'file_storage_test_error_amazon' => "There appears to be a problem with your Amazon (%s) file storage settings which can cause problems with uploads.
After attempting to upload a file to the directory, the URL to the file is returning a HTTP %s error. Update your settings and then check and see if the problem has been resolved", @@ -128,8 +130,8 @@ $lang = array( 'base_url' => "Site URL", 'err_db_exists' => "There is already an Invision Community installation in that database. Choose a different database or use a table prefix.", 'err_db_cant_create' => "The Database does not exist and cannot be created automatically. Please create the database manually or contact your hosting provider if you are unsure how to do this.", - 'diagnostics_reporting' => "Send diagnostics data to IPS?", - 'diagnostics_reporting_desc' => "This distribution is nulled and this setting does not work. Help Invision Community improve by automatically sending usage and diagnostic information. The data sent does not contain any private information about your users or your community.", + 'diagnostics_reporting' => "Send usage and diagnostics data to IPS?", + 'diagnostics_reporting_desc' => "This distribution is nulled and this setting does not work. Help Invision Community improve by automatically sending usage and diagnostic information including a list of features in use and basic statistics. The data sent does not contain any private information about your users or your community.", 'conf_global_error' => "", @@ -186,5 +188,12 @@ $lang = array( 'session_check_fail' => "The installer uses PHP sessions to store data, however PHP sessions are currently not working correctly on your server. This is an issue you will need to contact your host about.", +'files-1' => "File could not be opened: %s", +'files-2' => "File does not exist: %s", +'files-4' => "File could not be copied: %s", +'files-5' => "File could not be moved: %s", +'files-3' => "File could not be saved: %s", +'files-6' => "Folder could not be created: %s", +'files-7' => "Response returned a 400 response code but no Amazon region was returned: %s", ); \ No newline at end of file diff --git a/admin/upgrade/extract.php b/admin/upgrade/extract.php new file mode 100644 index 00000000..b64cb34a --- /dev/null +++ b/admin/upgrade/extract.php @@ -0,0 +1,397 @@ + + + +Invision Community Update Extractor + + + +Invision Power Services, Inc. + * @copyright (c) Invision Power Services, Inc. + * @license https://www.invisioncommunity.com/legal/standards/ + * @package Invision Community + * @since 31 Jul 2017 + */ + +// This file deliberately exists outside of the framework +// and MUST NOT call init.php + +@ini_set('display_errors', 'off'); + +@require( "../../system/3rd_party/pclzip/pclzip.lib.php" ); + +if ( file_exists( "../../constants.php" ) ) +{ + require "../../constants.php"; +} +foreach ( array( 'FOLDER_PERMISSION_NO_WRITE' => 0755, 'FILE_PERMISSION_NO_WRITE' => 0644, 'TEMP_DIRECTORY' => sys_get_temp_dir() ) as $k => $v ) +{ + if ( !defined( $k ) ) + { + define( $k, $v ); + } +} + +/** + * Extractor Class + */ +class Extractor +{ + const NUMBER_PER_GO = 20; + + /** + * @brief File + */ + private $file; + + /** + * @brief Root Directory + */ + private $container; + + /** + * @brief PclZip Object + */ + private $zip; + + /** + * @brief Zip Contents + */ + private $contents; + + /** + * @brief FTP Connection + */ + private $ftp; + + /** + * @brief SSH Connection + */ + private $ssh; + + /** + * @brief SFTP Connection + */ + private $sftp; + + /** + * @brief SFTP Directory + */ + private $sftpDir; + + /** + * Constructor + * + * @param string $file Zip File + * @param string $container Root directory + * @return void + */ + public function __construct( $file, $container ) + { + if ( !$file or !$container ) + { + throw new Exception; + } + + $this->file = $file; + $this->container = $container . '/'; + } + + /** + * Security Check + * + * @param string $key Security key + * @return void + */ + public function securityCheck( $key ) + { + require "../../conf_global.php"; + return $key === md5( $INFO['board_start'] . $_GET['file'] . $INFO['sql_pass'] ); + } + + /** + * Establish FTP/SSH connection + * + * @param array $value FTP/SSH Credentials + * @return void + */ + public function connectToFtp( $value ) + { + if ( $value['protocol'] == 'sftp' ) + { + $this->ssh = ssh2_connect( $value['server'], $value['port'] ); + if ( $this->ssh === FALSE ) + { + throw new Exception; + } + if ( !@ssh2_auth_password( $this->ssh, $value['un'], $value['pw'] ) ) + { + throw new Exception; + } + $this->sftp = @ssh2_sftp( $this->ssh ); + if ( $this->sftp === FALSE ) + { + throw new Exception; + } + + if ( $value['path'] and !@ssh2_sftp_stat( $this->sftp, $value['path'] ) ) + { + throw new Exception; + } + + $this->sftpDir = ssh2_sftp_realpath( $this->sftp, $value['path'] ) . '/'; + } + else + { + if ( $value['protocol'] == 'ssl_ftp' ) + { + $this->ftp = @ftp_ssl_connect( $value['server'], $value['port'], 3 ); + } + else + { + $this->ftp = @ftp_connect( $value['server'], $value['port'], 3 ); + } + if ( $this->ftp === FALSE ) + { + throw new Exception; + } + if ( !@ftp_login( $this->ftp, $value['un'], $value['pw'] ) ) + { + throw new Exception; + } + if( ftp_nlist( $this->ftp, '.' ) === FALSE ) + { + @ftp_pasv( $this->ftp, true ); + } + + if ( !@ftp_chdir( $this->ftp, $value['path'] ) ) + { + throw new Exception; + } + } + } + + /** + * Number of files + * + * @return int + */ + public function numberOfFiles() + { + $properties = $this->zip->properties(); + return $properties['nb']; + } + + /** + * Extract the files + * + * @param int $offset Offset + * @return int + */ + public function extract( $offset ) + { + $this->zip = new PclZip( $this->file ); + $this->contents = $this->zip->listContent(); + if ( !$this->contents ) + { + throw new Exception; + } + + $done = 0; + for ( $i = 0; $i < self::NUMBER_PER_GO; $i++ ) + { + $index = $offset + $i; + + if ( isset( $this->contents[ $index ] ) ) + { + $this->_extractFile( $index ); + $done++; + } + else + { + return $done; + } + } + + return $done; + } + + /** + * Extract a particular file + * + * @param int $index File index in zip + * @return void + */ + private function _extractFile( $index ) + { + /* Get the file */ + $path = mb_substr( $this->contents[ $index ]['filename'], 0, mb_strlen( $this->container ) ) === $this->container ? mb_substr( $this->contents[ $index ]['filename'], mb_strlen( $this->container ) ) : $this->contents[ $index ]['filename']; + if ( !$path or mb_substr( $path, -1 ) === '/' or mb_substr( $path, 0, 1 ) === '.' or mb_substr( $path, 0, 9 ) === '__MACOSX/' ) + { + return; + } + + /* Create a directory if needed */ + $dir = dirname( $path ); + $directories = array( $dir ); + while ( $dir != '.' ) + { + $dir = dirname( $dir ); + if ( $dir != '.' ) + { + $directories[] = $dir; + } + } + foreach ( array_reverse( $directories ) as $dir ) + { + if ( !is_dir( "../../{$dir}" ) ) + { + if ( $this->sftp ) + { + @ssh2_sftp_mkdir( $this->sftp, $this->sftpDir . $dir ); + } + if ( $this->ftp ) + { + @ftp_mkdir( $this->ftp, $dir ); + } + else + { + @mkdir( "../../{$dir}", FOLDER_PERMISSION_NO_WRITE ); + } + } + } + + /* Write contents */ + $contents = @$this->zip->extractByIndex( $index, \PCLZIP_OPT_EXTRACT_AS_STRING ); + $contents = $contents[0]['content']; + if ( $this->sftp or $this->ftp ) + { + $tmpFile = tempnam( TEMP_DIRECTORY, 'IPS' ); + \file_put_contents( $tmpFile, $contents ); + + if ( $this->sftp ) + { + if ( @ssh2_scp_send( $this->ssh, $tmpFile, $this->sftpDir . $path ) === FALSE ) + { + throw new \Exception; + } + } + else + { + if ( @ftp_put( $this->ftp, $path, $tmpFile, FTP_BINARY ) === FALSE ) + { + throw new \Exception; + } + } + + @unlink( $tmpFile ); + } + else + { + /* Determine if the file exists (we'll want to know this later) */ + $fileExists = file_exists( "../../{$path}" ); + + $fh = @\fopen( "../../{$path}", 'w+' ); + if ( $fh === FALSE ) + { + $lastError = error_get_last(); + throw new Exception( $lastError['message'] ); + } + if ( @\fwrite( $fh, $contents ) === FALSE ) + { + $lastError = error_get_last(); + throw new Exception( $lastError['message'] ); + } + else + { + /* If the file existed before we started, we should clear it from opcache if opcache is enabled */ + if( $fileExists ) + { + if ( function_exists( 'opcache_invalidate' ) ) + { + @opcache_invalidate( "../../{$path}" ); + } + } + /* Otherwise, we should set file permissions on the file if it's brand new in case server defaults to something odd */ + else + { + @chmod( "../../{$path}", FILE_PERMISSION_NO_WRITE ); + } + } + @\fclose( $fh ); + } + } +} + +/* ! Controller */ +try +{ + $extractor = new Extractor( isset( $_GET['file'] ) ? $_GET['file'] : NULL, isset( $_GET['container'] ) ? $_GET['container'] : '' ); + + /* Check this request came from the ACP */ + if ( !$extractor->securityCheck( $_GET['key'] ) ) + { + throw new Exception; + } + + /* Establish an FTP connection if necessary */ + if ( $_GET['ftp'] ) + { + $extractor->connectToFtp( $_GET['ftp'] ); + } + + /* Extract a batch of files */ + $i = isset( $_GET['i'] ) ? $_GET['i'] : 0; + $done = $extractor->extract( $i ); + + /* If we didn't extract anything, are we done? */ + if ( !$done and $i >= $extractor->numberOfFiles() ) + { + @unlink( $_GET['file'] ); + + if ( function_exists( 'opcache_reset' ) ) + { + @opcache_reset(); + } + + echo << +
+ + +HTML; + } + + /* Nope, redirect to the next batch */ + else + { + $newI = $i + $extractor::NUMBER_PER_GO; + $percentComplete = round( 100 / $extractor->numberOfFiles() * $newI ); + + $properties = array( + 'file' => $_GET['file'], + 'container' => $_GET['container'], + 'key' => $_GET['key'], + 'ftp' => $_GET['ftp'], + 'i' => $newI, + ); + $url = "extract.php?" . http_build_query( $properties ); + echo << +
+ + + +HTML; + } +} +catch ( Exception $e ) +{ + echo ""; + exit; +} +?> + + \ No newline at end of file diff --git a/admin/upgrade/html/forms/login.phtml b/admin/upgrade/html/forms/login.phtml index d850faa0..5229333a 100644 --- a/admin/upgrade/html/forms/login.phtml +++ b/admin/upgrade/html/forms/login.phtml @@ -1,30 +1,36 @@ - + {{if $error !== NULL}}
{lang="$error"}
-
{{endif}} -
-
- {{foreach $forms as $k => $form}} - {{if $k === '_standard'}} - {$form|raw} - {{endif}} - {{endforeach}} -
- {{if count ( $forms ) > 1}} -
-

{lang='sign_in_faster'}

-

{lang='sign_in_connect'}

-
- {{foreach $forms as $k => $form}} - {{if $k !== '_standard'}} - {$form|raw} - {{endif}} - {{endforeach}} -
- {{endif}} -
+
+ +
    +
  • + +
    + auth )}}value="{request="auth"}"{{endif}}> +
    +
  • +
  • + +
    + password )}}value="{request="password"}"{{endif}}> +
    +
  • +
  • + +     + {lang="help"} +
  • +
+
\ No newline at end of file diff --git a/admin/upgrade/html/forms/template.phtml b/admin/upgrade/html/forms/template.phtml index 89f7950a..5b7030fa 100644 --- a/admin/upgrade/html/forms/template.phtml +++ b/admin/upgrade/html/forms/template.phtml @@ -12,7 +12,7 @@ {{endforeach}} {{if $uploadField}} - + {{endif}} {{if $error}}
diff --git a/admin/upgrade/html/global/globalTemplate.phtml b/admin/upgrade/html/global/globalTemplate.phtml index 1a668a89..1a162f79 100644 --- a/admin/upgrade/html/global/globalTemplate.phtml +++ b/admin/upgrade/html/global/globalTemplate.phtml @@ -24,7 +24,7 @@ diff --git a/admin/upgrade/html/global/healthcheck.phtml b/admin/upgrade/html/global/healthcheck.phtml index e3a52792..76015c0e 100644 --- a/admin/upgrade/html/global/healthcheck.phtml +++ b/admin/upgrade/html/global/healthcheck.phtml @@ -1,6 +1,28 @@ - + {{$canProceed = TRUE;}}
+ {{if $incorrectFiles !== NULL}} + {{if $incorrectFiles}} + {{$canProceed = FALSE;}} +

{lang="hc_files"}

+

+

{lang="hc_files_fail"}

+
+ {lang="hc_files_fail2"} +

+

{lang="hc_files_fail3"}

+
    + {{foreach $incorrectFiles as $file}} +
  • {$file}
  • + {{endforeach}} +
+ {{else}} +

{lang="hc_files"}

+
    +
  • {lang="hc_files_ok"}
  • +
+ {{endif}} + {{endif}} {{if $designerMode}}

{lang="hc_designers_mode"}

    diff --git a/admin/upgrade/html/global/unfinishedUpgrade.phtml b/admin/upgrade/html/global/unfinishedUpgrade.phtml index 3029fd5d..4e134cb6 100644 --- a/admin/upgrade/html/global/unfinishedUpgrade.phtml +++ b/admin/upgrade/html/global/unfinishedUpgrade.phtml @@ -23,5 +23,4 @@
\ No newline at end of file diff --git a/admin/upgrade/html/global/upgradeError.phtml b/admin/upgrade/html/global/upgradeError.phtml index ed6dd3db..57a158cd 100644 --- a/admin/upgrade/html/global/upgradeError.phtml +++ b/admin/upgrade/html/global/upgradeError.phtml @@ -8,12 +8,12 @@ {{if $trace[3]['function'] == 'installDatabaseUpdates'}} {expression="\IPS\ROOT_PATH"}/applications/{$trace[4]['args'][0][1]}/setup/upg_{$trace[3]['args'][0]}/queries.json{{if isset($_SESSION['lastJsonIndex'])}} - query #{$_SESSION['lastJsonIndex']}{{endif}}
-
{$exception->query}
+
{{if $exception->query}}{$exception->query}{{else}}{$trace[0]['args'][0]}{{endif}}
{{else}} {$trace[1]['file']}::{$trace[1]['line']}
-
{$exception->query}
+
{{if $exception->query}}{$exception->query}{{else}}{$trace[0]['args'][0]}{{endif}}
{{endif}} {{else}} diff --git a/admin/upgrade/index.php b/admin/upgrade/index.php index 620ad094..ed5dd881 100644 --- a/admin/upgrade/index.php +++ b/admin/upgrade/index.php @@ -9,6 +9,7 @@ */ define('READ_WRITE_SEPARATION', FALSE); +define('REPORT_EXCEPTIONS', TRUE); /* Prevent hooks from running during the upgrade */ define('RECOVERY_MODE', TRUE); diff --git a/admin/upgrade/lang.php b/admin/upgrade/lang.php index e06386d2..871b9914 100644 --- a/admin/upgrade/lang.php +++ b/admin/upgrade/lang.php @@ -37,6 +37,7 @@ $lang = array( 'create_conf_global' => "Please create a %s directory and make it writeable. If you are not sure how to do this, contact your hosting provider.", 'session_no_good' => "We were unable to start a PHP session. You will need to contact your host to adjust your PHP configuration before you can continue. The error reported was: %s", 'upgrade_group_not_exist' => "You do not have permission to run the upgrader because your group does not exist.", + 'help' => "Help", 'sign_in_short' => "Sign In", 'auth' => "Display Name or Email Address", @@ -46,7 +47,7 @@ $lang = array( 'username' => "Display Name", 'email_address' => "Email Address", 'username_or_email' => "Username or Email Address", - 'login_err_no_account' => "The %s you entered does not belong to any account. Make sure that it is typed correctly.", + 'login_err_no_account' => "The email address you entered does not belong to any account. Make sure that it is typed correctly.", 'login_err_bad_password' => "The password you entered is incorrect. Please try again (make sure your caps lock is off).", 'login_err_locked_unlock' => "Your account has been locked. Try again in {# [1:minute][?:minutes]}.", 'login_err_locked_nounlock' => "Your account has been locked. Try again later.", @@ -106,6 +107,8 @@ $lang = array( 'requirements_mysql_utf8_info' => "%s is %s", 'requirements_file_system' => "File System", 'requirements_file_writable' => "%s is writable", + 'requirements_mysql_timeout' => "Your MySQL %s system variable is currently set to an extremely low value (%s). The default MySQL value is 28800. It is recommended to increase this MySQL system variable to at least 20 in order to prevent potential problems with queries timing out.", + 'dir_not_provided' => "No directory provided. Please check file storage configurations.", 'dir_does_not_exist' => "%s does not exist.", 'dir_is_not_writable' => "%s cannot be written to. Please adjust the permissions on it or contact your hosting provider for assistance.", 'file_storage_test_error_amazon' => "There appears to be a problem with your Amazon (%s) file storage settings which can cause problems with uploads.
After attempting to upload a file to the directory, the URL to the file is returning a HTTP %s error. Update your settings and then check and see if the problem has been resolved", @@ -507,7 +510,7 @@ $lang = array( /* ! 101000 revert globalTemplate */ '101000_globalTemplate_revert' => "Revert custom themes which contain out of date globalTemplate templates?", '101000_globalTemplate_revert_desc' => "In Invision Community 4.1, the template 'utilitiesMenu' has been removed. This is used within the globalTemplate. After upgrading, you may see a message about the theme being out of date if you do not revert.
Reverting templates will lose any customizations", - '101000_yes' => "Yes, revert losing customiztions", + '101000_yes' => "Yes, revert losing customizations", '101000_no' => "No, I will manually adjust the templates after upgrading", /* ! CMS 101000 Options */ @@ -522,11 +525,14 @@ $lang = array( /* ! Core 101079 Diagnostic reporting option */ '101079_diagnostics_reporting' => "Send diagnostics data to IPS?", - '101079_diagnostics_reporting_desc' => "This distribution is nulled and this setting does not work. Help Invision Community improve by automatically sending usage and diagnostic information. The data sent does not contain any private information about your users or your community.", + '101079_diagnostics_reporting_desc' => "This distribution is nulled and this setting does not work. Help Invision Community improve by automatically sending diagnostic information. The data sent does not contain any private information about your users or your community.", /* ! Core 102000 Letter photo option */ 'options_letter_photos' => "Enable letter photos?", 'options_letter_photos_desc' => "Do you wish to start using automatic letter photos instead of the default theme profile photo for users who have not uploaded a profile photo?", + + /* ! IPS Connect discontinued warning */ + 'ipsconnect' => "IPS Connect", 'no_apps_upgrade' => 'There are no applications available to upgrade', 'exit_upgrader' => "Exit upgrader", @@ -535,7 +541,6 @@ $lang = array( 'convert_charset_info' => "Your community suite data or database configuration is saved in an encoding other than UTF-8. Before your site can be upgraded, we must convert the encoding to UTF-8.", 'start_upgrade' => "Start Upgrade", 'continue_upgrade' => "Continue Upgrade", - 'start_fresh_upgrade' => "Start Fresh Upgrade", 'continue_not_set' => "Not set", 'unfinished_upgrade_info' => "You have an unfinished upgrade from %s", 'hc_designers_mode' => "Designers' Mode On", @@ -556,5 +561,28 @@ $lang = array( 'start_info' => "This process will install your software for you. Be sure you have your license key and MySQL database details to hand.", 'install_docs' => "Install Guide", 'js_confirm_mrerror' => 'The server encountered multiple instances where it has stopped responding.\nPress \'OK\' to reload this page and re-run this installation step.', + 'hc_files' => "File Check", + 'hc_files_ok' => "Source files are correct for the latest version", + 'hc_files_fail' => "Some source files are not correct for the latest version. If you uploaded the files to your server manually, the process may have failed or not completed yet, or a new version may have been released since you downloaded. Download latest version from your client area and upload the files again in order to continue.", + 'hc_files_fail2' => "Go To Client Area", + 'hc_files_fail3' => "If you are sure the files have been uploaded correctly, make sure the permissions are set correctly on them.", + + /* ! Core - 4.3 - Removing HTTPS settings */ + 'https_settings_changes' => "HTTPS Settings Changes", + '103000_usage_reporting' => "Send usage data to IPS?", + '103000_usage_reporting_desc' => "Help Invision Community improve by automatically sending usage information including a list of features in use and basic statistics. The data sent does not contain any private information about your users or your community.", + 'admincp_hide_deprecate' => "Hide AdminCP link", + 'recaptcha_v1_removed' => "CAPTCHA Settings", + '103000_ipsconnect_url' => "IPS Connect Master Site URL", + '103000_ipsconnect_client_id' => "IPS Connect Client Identifier", + '103000_ipsconnect_client_secret' => "IPS Connect Client Secret", + +'files-1' => "File could not be opened: %s", +'files-2' => "File does not exist: %s", +'files-4' => "File could not be copied: %s", +'files-5' => "File could not be moved: %s", +'files-3' => "File could not be saved: %s", +'files-6' => "Folder could not be created: %s", +'files-7' => "Response returned a 400 response code but no Amazon region was returned: %s", ); \ No newline at end of file diff --git a/applications/blog/api/blogs.php b/applications/blog/api/blogs.php index 99a97cfb..25e01bce 100644 --- a/applications/blog/api/blogs.php +++ b/applications/blog/api/blogs.php @@ -33,12 +33,14 @@ class _blogs extends \IPS\Node\Api\NodeController * GET /blog/blogs * Get list of blogs * + * @note For requests using an OAuth Access Token for a particular member, only blogs that are not disabled and not belonging to a particular club or social group will be included * @apiparam string owners Comma-delimited list of member IDs - if provided, only blogs owned by those members are returned (can be used in conjection with groups or set to 0 to exclude member-created blogs) * @apiparam string groups Comma-delimited list of group IDs - if provided, only blogs owned by those groups are returned (can be used in conjection with members or set to 0 to exclude group blogs) * @apiparam int pinned If 1, only blogs which are pinned are returned, if 0 only not pinned * @apiparam string sortBy What to sort by. Can be 'count_entries' for number of entries, 'last_edate' for last entry date or do not specify for ID * @apiparam string sortDir Sort direction. Can be 'asc' or 'desc' - defaults to 'asc' * @apiparam int page Page number + * @apiparam int perPage Number of results per page - defaults to 25 * @return \IPS\Api\PaginatedResponse */ public function GETindex() @@ -65,6 +67,12 @@ class _blogs extends \IPS\Node\Api\NodeController { $where[] = array( 'blog_pinned=?', intval( \IPS\Request::i()->pinned ) ); } + + /* Permission */ + if ( $this->member ) + { + $where[] = array( 'blog_disabled=0 AND blog_social_group IS NULL AND blog_club_id IS NULL' ); + } /* Sort */ if ( isset( \IPS\Request::i()->sortBy ) and in_array( \IPS\Request::i()->sortBy, array( 'count_entries', 'last_edate' ) ) ) @@ -83,7 +91,9 @@ class _blogs extends \IPS\Node\Api\NodeController \IPS\Db::i()->select( '*', 'blog_blogs', $where, "{$sortBy} {$sortDir}" ), isset( \IPS\Request::i()->page ) ? \IPS\Request::i()->page : 1, 'IPS\blog\Blog', - \IPS\Db::i()->select( 'COUNT(*)', 'blog_blogs', $where )->first() + \IPS\Db::i()->select( 'COUNT(*)', 'blog_blogs', $where )->first(), + $this->member, + isset( \IPS\Request::i()->perPage ) ? \IPS\Request::i()->perPage : NULL ); } @@ -92,7 +102,7 @@ class _blogs extends \IPS\Node\Api\NodeController * Get information about a specific blog * * @param int $id ID Number - * @throws 2B302/1 INVALID_ID The blog ID does not exist + * @throws 2B302/1 INVALID_ID The blog ID does not exist or the authorized user does not have permission to view it * @return \IPS\blog\Blog */ public function GETitem( $id ) @@ -106,9 +116,27 @@ class _blogs extends \IPS\Node\Api\NodeController * * @param int $id ID Number * @return void + * @throws 2B302/2 INVALID_ID The blog ID does not exist or the authorized user does not have permission to view it + * @throws 2B302/3 NO_PERMISSION The authorized user does not have permission to delete the blog */ public function DELETEitem( $id ) { - return $this->_delete( $id ); + $class = $this->class; + + try + { + $blog = $this->member ? $class::loadAndCheckPerms( $id ) : $class::load( $id ); + if ( !$blog->canDelete( $this->member ) ) + { + throw new \IPS\Api\Exception( 'INVALID_ID', '2B302/3', 404 ); + } + $blog->delete(); + + return new \IPS\Api\Response( 200, NULL ); + } + catch ( \OutOfRangeException $e ) + { + throw new \IPS\Api\Exception( 'INVALID_ID', '2B302/2', 404 ); + } } } \ No newline at end of file diff --git a/applications/blog/api/comments.php b/applications/blog/api/comments.php index 11f9ae51..21f138e9 100644 --- a/applications/blog/api/comments.php +++ b/applications/blog/api/comments.php @@ -30,18 +30,19 @@ class _comments extends \IPS\Content\Api\CommentController /** * GET /blog/comments - * Get list of comments * - * @apiparam string blogs Comma-delimited list of calendar IDs + * @note For requests using an OAuth Access Token for a particular member, only comments the authorized user can view will be included, and all comments on draft entries are excluded + * @apiparam string blogs Comma-delimited list of blog IDs * @apiparam string authors Comma-delimited list of member IDs - if provided, only topics started by those members are returned * @apiparam int locked If 1, only comments from entries which are locked are returned, if 0 only unlocked * @apiparam int hidden If 1, only comments which are hidden are returned, if 0 only not hidden * @apiparam int pinned If 1, only posts from topics which are pinned are returned, if 0 only not pinned * @apiparam int featured If 1, only comments from entries which are featured are returned, if 0 only not featured - * @apiparam int draft If 1, only draft entries are returned, if 0 only published + * @apiparam int draft If 1, only draft entries are returned, if 0 only published. Ignored for requests using an OAuth Access Token for a particular member * @apiparam string sortBy What to sort by. Can be 'date', 'title' or leave unspecified for ID * @apiparam string sortDir Sort direction. Can be 'asc' or 'desc' - defaults to 'asc' * @apiparam int page Page number + * @apiparam int perPage Number of results per page - defaults to 25 * @return \IPS\Api\PaginatedResponse */ public function GETindex() @@ -50,7 +51,11 @@ class _comments extends \IPS\Content\Api\CommentController $where = array(); /* Draft */ - if ( isset( \IPS\Request::i()->draft ) ) + if ( $this->member ) + { + $where[] = array( 'entry_status=?', 'published' ); + } + elseif ( isset( \IPS\Request::i()->draft ) ) { $where[] = array( 'entry_status=?', \IPS\Request::i()->draft ? 'draft' : 'published' ); } @@ -64,14 +69,24 @@ class _comments extends \IPS\Content\Api\CommentController * View information about a specific comment * * @param int $id ID Number - * @throws 2B301/1 INVALID_ID The comment ID does not exist + * @throws 2B301/1 INVALID_ID The comment ID does not exist or the authorized user does not have permission to view it * @return \IPS\blog\Entry\Comment */ public function GETitem( $id ) { try { - return new \IPS\Api\Response( 200, \IPS\blog\Entry\Comment::load( $id )->apiOutput() ); + $class = $this->class; + if ( $this->member ) + { + $object = $class::loadAndCheckPerms( $id, $this->member ); + } + else + { + $object = $class::load( $id ); + } + + return new \IPS\Api\Response( 200, $object->apiOutput( $this->member ) ); } catch ( \OutOfRangeException $e ) { @@ -83,21 +98,23 @@ class _comments extends \IPS\Content\Api\CommentController * POST /blog/comments * Create a comment * + * @note For requests using an OAuth Access Token for a particular member, any parameters the user doesn't have permission to use are ignored (for example, hidden will only be honoured if the authentictaed user has permission to hide content). * @reqapiparam int entry The ID number of the entry the comment is for - * @reqapiparam int author The ID number of the member making the comment (0 for guest) + * @reqapiparam int author The ID number of the member making the comment (0 for guest). Required for requests made using an API Key or the Client Credentials Grant Type. For requests using an OAuth Access Token for a particular member, that member will always be the author * @apiparam string author_name If author is 0, the guest name that should be used - * @reqapiparam string content The comment content as HTML (e.g. "

This is a comment.

") - * @apiparam datetime date The date/time that should be used for the comment date. If not provided, will use the current date/time - * @apiparam string ip_address The IP address that should be stored for the comment. If not provided, will use the IP address from the API request + * @reqapiparam string content The comment content as HTML (e.g. "

This is a comment.

"). Will be sanatized for requests using an OAuth Access Token for a particular member; will be saved unaltered for requests made using an API Key or the Client Credentials Grant Type. + * @apiparam datetime date The date/time that should be used for the comment date. If not provided, will use the current date/time. Ignored for requests using an OAuth Access Token for a particular member + * @apiparam string ip_address The IP address that should be stored for the comment. If not provided, will use the IP address from the API request. Ignored for requests using an OAuth Access Token for a particular member * @apiparam int hidden 0 = unhidden; 1 = hidden, pending moderator approval; -1 = hidden (as if hidden by a moderator) * @throws 2B301/2 INVALID_ID The comment ID does not exist * @throws 1B301/3 NO_AUTHOR The author ID does not exist * @throws 1B301/4 NO_CONTENT No content was supplied + * @throws 2B301/8 NO_PERMISSION The authorized user does not have permission to comment on that blog entry * @return \IPS\blog\Entry\Comment */ public function POSTindex() { - /* Get topic */ + /* Get entry */ try { $entry = \IPS\blog\Entry::load( \IPS\Request::i()->entry ); @@ -108,18 +125,29 @@ class _comments extends \IPS\Content\Api\CommentController } /* Get author */ - if ( \IPS\Request::i()->author ) + if ( $this->member ) { - $author = \IPS\Member::load( \IPS\Request::i()->author ); - if ( !$author->member_id ) + if ( !$entry->canComment( $this->member ) ) { - throw new \IPS\Api\Exception( 'NO_AUTHOR', '1B301/3', 404 ); + throw new \IPS\Api\Exception( 'NO_PERMISSION', '2B301/8', 403 ); } + $author = $this->member; } else { - $author = new \IPS\Member; - $author->name = \IPS\Request::i()->author_name; + if ( \IPS\Request::i()->author ) + { + $author = \IPS\Member::load( \IPS\Request::i()->author ); + if ( !$author->member_id ) + { + throw new \IPS\Api\Exception( 'NO_AUTHOR', '1B301/3', 404 ); + } + } + else + { + $author = new \IPS\Member; + $author->name = \IPS\Request::i()->author_name; + } } /* Check we have a post */ @@ -136,13 +164,15 @@ class _comments extends \IPS\Content\Api\CommentController * POST /blog/comments/{id} * Edit a comment * + * @note For requests using an OAuth Access Token for a particular member, any parameters the user doesn't have permission to use are ignored (for example, hidden will only be honoured if the authentictaed user has permission to hide content). * @param int $id ID Number - * @apiparam int author The ID number of the member making the comment (0 for guest) + * @apiparam int author The ID number of the member making the comment (0 for guest). Ignored for requests using an OAuth Access Token for a particular member. * @apiparam string author_name If author is 0, the guest name that should be used - * @apiparam string content The comment content as HTML (e.g. "

This is a comment.

") + * @apiparam string content The comment content as HTML (e.g. "

This is a comment.

"). Will be sanatized for requests using an OAuth Access Token for a particular member; will be saved unaltered for requests made using an API Key or the Client Credentials Grant Type. * @apiparam int hidden 1/0 indicating if the topic should be hidden - * @throws 2B301/5 INVALID_ID The comment ID does not exist + * @throws 2B301/5 INVALID_ID The comment ID does not exist or the authorized user does not have permission to view it * @throws 1B301/6 NO_AUTHOR The author ID does not exist + * @throws 2B301/9 NO_PERMISSION The authorized user does not have permission to edit the comment * @return \IPS\blog\Entry\Comment */ public function POSTitem( $id ) @@ -151,6 +181,14 @@ class _comments extends \IPS\Content\Api\CommentController { /* Load */ $comment = \IPS\blog\Entry\Comment::load( $id ); + if ( $this->member and !$comment->canView( $this->member ) ) + { + throw new \OutOfRangeException; + } + if ( $this->member and !$comment->canEdit( $this->member ) ) + { + throw new \IPS\Api\Exception( 'NO_PERMISSION', '2B301/9', 403 ); + } /* Do it */ try @@ -173,14 +211,21 @@ class _comments extends \IPS\Content\Api\CommentController * Deletes a comment * * @param int $id ID Number - * @throws 2B301/7 INVALID_ID The comment ID does not exist + * @throws 2B301/7 INVALID_ID The comment ID does not exist + * @throws 2B301/A NO_PERMISSION The authorized user does not have permission to delete the comment * @return void */ public function DELETEitem( $id ) { try { - \IPS\blog\Entry\Comment::load( $id )->delete(); + $class = $this->class; + $object = $class::load( $id ); + if ( $this->member and !$object->canDelete( $this->member ) ) + { + throw new \IPS\Api\Exception( 'NO_PERMISSION', '2B301/A', 403 ); + } + $object->delete(); return new \IPS\Api\Response( 200, NULL ); } diff --git a/applications/blog/api/entries.php b/applications/blog/api/entries.php index 9df60dba..1339b30d 100644 --- a/applications/blog/api/entries.php +++ b/applications/blog/api/entries.php @@ -32,6 +32,7 @@ class _entries extends \IPS\Content\Api\ItemController * GET /blog/entries * Get list of entries * + * @note For requests using an OAuth Access Token for a particular member, only entries that are published and in blogs that are not disabled and not belonging to a particular club or social group will be included * @apiparam string blogs Comma-delimited list of blog IDs * @apiparam string authors Comma-delimited list of member IDs - if provided, only entries started by those members are returned * @apiparam int locked If 1, only entries which are locked are returned, if 0 only unlocked @@ -42,6 +43,7 @@ class _entries extends \IPS\Content\Api\ItemController * @apiparam string sortBy What to sort by. Can be 'date' for creation date, 'title' or leave unspecified for ID * @apiparam string sortDir Sort direction. Can be 'asc' or 'desc' - defaults to 'asc' * @apiparam int page Page number + * @apiparam int perPage Number of results per page - defaults to 25 * @return \IPS\Api\PaginatedResponse */ public function GETindex() @@ -49,8 +51,12 @@ class _entries extends \IPS\Content\Api\ItemController /* Where clause */ $where = array(); - /* Draft */ - if ( isset( \IPS\Request::i()->draft ) ) + /* Permission */ + if ( $this->member ) + { + $where[] = array( 'entry_status=? AND blog_disabled=0 AND blog_social_group IS NULL AND blog_club_id IS NULL', 'published' ); + } + elseif ( isset( \IPS\Request::i()->draft ) ) { $where[] = array( 'entry_status=?', \IPS\Request::i()->draft ? 'draft' : 'published' ); } @@ -85,7 +91,8 @@ class _entries extends \IPS\Content\Api\ItemController * * @param int $id ID Number * @apiparam int page Page number - * @throws 2B300/1 INVALID_ID The entry ID does not exist + * @apiparam int perPage Number of results per page - defaults to 25 + * @throws 2B300/1 INVALID_ID The entry ID does not exist or the authorized user does not have permission to view it * @return \IPS\Api\PaginatedResponse */ public function GETitem_comments( $id ) @@ -104,15 +111,16 @@ class _entries extends \IPS\Content\Api\ItemController * POST /blog/entries * Create an entry * + * @note For requests using an OAuth Access Token for a particular member, any parameters the user doesn't have permission to use are ignored (for example, locked will only be honoured if the authentictaed user has permission to lock topics). * @reqapiparam int blog The ID number of the blog the entry should be created in - * @reqapiparam int author The ID number of the member creating the entry (0 for guest) + * @reqapiparam int author The ID number of the member creating the entry (0 for guest). Required for requests made using an API Key or the Client Credentials Grant Type. For requests using an OAuth Access Token for a particular member, that member will always be the author * @reqapiparam string title The entry title - * @reqapiparam string entry The entry content as HTML (e.g. "

This is a blog entry.

") + * @reqapiparam string entry The entry content as HTML (e.g. "

This is a blog entry.

"). Will be sanatized for requests using an OAuth Access Token for a particular member; will be saved unaltered for requests made using an API Key or the Client Credentials Grant Type. * @apiparam bool draft If this is a draft * @apiparam string prefix Prefix tag * @apiparam string tags Comma-separated list of tags (do not include prefix) - * @apiparam datetime date The date/time that should be used for the entry date. If not provided, will use the current date/time - * @apiparam string ip_address The IP address that should be stored for the entry/post. If not provided, will use the IP address from the API request + * @apiparam datetime date The date/time that should be used for the entry date. If not provided, will use the current date/time. Ignored for requests using an OAuth Access Token for a particular member + * @apiparam string ip_address The IP address that should be stored for the entry/post. If not provided, will use the IP address from the API request. Ignored for requests using an OAuth Access Token for a particular member * @apiparam int locked 1/0 indicating if the entry should be locked * @apiparam int hidden 0 = unhidden; 1 = hidden, pending moderator approval; -1 = hidden (as if hidden by a moderator) * @apiparam int pinned 1/0 indicating if the entry should be pinned @@ -121,6 +129,7 @@ class _entries extends \IPS\Content\Api\ItemController * @throws 1B300/3 NO_AUTHOR The author ID does not exist * @throws 1B300/4 NO_TITLE No title was supplied * @throws 1B300/5 NO_CONTENT No content was supplied + * @throws 1B300/A NO_PERMISSION The authorized user does not have permission to create an entry in that blog * @return \IPS\blog\Entry */ public function POSTindex() @@ -136,17 +145,28 @@ class _entries extends \IPS\Content\Api\ItemController } /* Get author */ - if ( \IPS\Request::i()->author ) + if ( $this->member ) { - $author = \IPS\Member::load( \IPS\Request::i()->author ); - if ( !$author->member_id ) + if ( !$blog->can( 'add', $this->member ) ) { - throw new \IPS\Api\Exception( 'NO_AUTHOR', '1B300/3', 400 ); + throw new \IPS\Api\Exception( 'NO_PERMISSION', '1B300/A', 403 ); } + $author = $this->member; } else { - $author = new \IPS\Member; + if ( \IPS\Request::i()->author ) + { + $author = \IPS\Member::load( \IPS\Request::i()->author ); + if ( !$author->member_id ) + { + throw new \IPS\Api\Exception( 'NO_AUTHOR', '1B300/3', 400 ); + } + } + else + { + $author = new \IPS\Member; + } } /* Check we have a title and a description */ @@ -160,29 +180,31 @@ class _entries extends \IPS\Content\Api\ItemController } /* Do it */ - return new \IPS\Api\Response( 201, $this->_create( $blog, $author )->apiOutput() ); + return new \IPS\Api\Response( 201, $this->_create( $blog, $author )->apiOutput( $this->member ) ); } /** * POST /blog/entries/{id} * Edit a blog entry * + * @note For requests using an OAuth Access Token for a particular member, any parameters the user doesn't have permission to use are ignored (for example, locked will only be honoured if the authentictaed user has permission to lock topics). * @reqapiparam int blog The ID number of the blog the entry should be created in - * @reqapiparam int author The ID number of the member creating the entry (0 for guest) + * @reqapiparam int author The ID number of the member creating the entry (0 for guest). Ignored for requests using an OAuth Access Token for a particular member. * @reqapiparam string title The entry title - * @reqapiparam string entry The entry content as HTML (e.g. "

This is a blog entry.

") + * @reqapiparam string entry The entry content as HTML (e.g. "

This is a blog entry.

"). Will be sanatized for requests using an OAuth Access Token for a particular member; will be saved unaltered for requests made using an API Key or the Client Credentials Grant Type. * @apiparam bool draft If this is a draft * @apiparam string prefix Prefix tag * @apiparam string tags Comma-separated list of tags (do not include prefix) - * @apiparam datetime date The date/time that should be used for the entry date. If not provided, will use the current date/time - * @apiparam string ip_address The IP address that should be stored for the entry/post. If not provided, will use the IP address from the API request + * @apiparam datetime date The date/time that should be used for the entry date. If not provided, will use the current date/time. Ignored for requests using an OAuth Access Token for a particular member. + * @apiparam string ip_address The IP address that should be stored for the entry/post. If not provided, will use the IP address from the API request. Ignored for requests using an OAuth Access Token for a particular member. * @apiparam int locked 1/0 indicating if the entry should be locked * @apiparam int hidden 0 = unhidden; 1 = hidden, pending moderator approval; -1 = hidden (as if hidden by a moderator) * @apiparam int pinned 1/0 indicating if the entry should be pinned * @apiparam int featured 1/0 indicating if the entry should be featured - * @throws 2B300/6 INVALID_ID The entry ID is invalid - * @throws 1B300/7 NO_BLOG The blog ID does not exist + * @throws 2B300/6 INVALID_ID The entry ID is invalid or the authorized user does not have permission to view it + * @throws 1B300/7 NO_BLOG The blog ID does not exist or the authorized user does not have permission to post in it * @throws 1B300/8 NO_AUTHOR The author ID does not exist + * @throws 1B300/B NO_PERMISSION The authorized user does not have permission to edit that blog entry * @return \IPS\blog\Entry */ public function POSTitem( $id ) @@ -190,13 +212,26 @@ class _entries extends \IPS\Content\Api\ItemController try { $entry = \IPS\blog\Entry::load( $id ); + if ( $this->member and !$entry->can( 'read', $this->member ) ) + { + throw new \OutOfRangeException; + } + if ( $this->member and !$entry->canEdit( $this->member ) ) + { + throw new \IPS\Api\Exception( 'NO_PERMISSION', '1B300/B', 403 ); + } /* New blog */ - if ( isset( \IPS\Request::i()->blog ) and \IPS\Request::i()->blog != $entry->forum_id ) + if ( isset( \IPS\Request::i()->blog ) and \IPS\Request::i()->blog != $entry->blog_id and ( !$this->member or $entry->canMove( $this->member ) ) ) { try { $newBlog = \IPS\blog\Blog::load( \IPS\Request::i()->blog ); + if ( $this->member and !$newBlog->can( 'add', $this->member ) ) + { + throw new \OutOfRangeException; + } + $entry->move( $newBlog ); } catch ( \OutOfRangeException $e ) @@ -206,7 +241,7 @@ class _entries extends \IPS\Content\Api\ItemController } /* New author */ - if ( isset( \IPS\Request::i()->author ) ) + if ( !$this->member and isset( \IPS\Request::i()->author ) ) { try { @@ -225,11 +260,11 @@ class _entries extends \IPS\Content\Api\ItemController } /* Everything else */ - $this->_createOrUpdate( $entry ); + $this->_createOrUpdate( $entry, 'edit' ); /* Save and return */ $entry->save(); - return new \IPS\Api\Response( 200, $entry->apiOutput() ); + return new \IPS\Api\Response( 200, $entry->apiOutput( $this->member ) ); } catch ( \OutOfRangeException $e ) { @@ -241,9 +276,10 @@ class _entries extends \IPS\Content\Api\ItemController * Create or update entry * * @param \IPS\Content\Item $item The item + * @param string $type add or edit * @return \IPS\Content\Item */ - protected function _createOrUpdate( \IPS\Content\Item $item ) + protected function _createOrUpdate( \IPS\Content\Item $item, $type='add' ) { /* Is draft */ if ( isset( \IPS\Request::i()->draft ) ) @@ -254,11 +290,16 @@ class _entries extends \IPS\Content\Api\ItemController /* Content */ if ( isset( \IPS\Request::i()->entry ) ) { - $item->content = \IPS\Request::i()->entry; + $entryContents = \IPS\Request::i()->entry; + if ( $this->member ) + { + $entryContents = \IPS\Text\Parser::parseStatic( $entryContents, TRUE, NULL, $this->member, 'blog_Entries' ); + } + $item->content = $entryContents; } /* Pass up */ - return parent::_createOrUpdate( $item ); + return parent::_createOrUpdate( $item, $type ); } /** @@ -266,14 +307,21 @@ class _entries extends \IPS\Content\Api\ItemController * Delete an entry * * @param int $id ID Number - * @throws 2B300/9 INVALID_ID The entry ID does not exist + * @throws 2B300/9 INVALID_ID The entry ID does not exist + * @throws 2B300/C NO_PERMISSION The authorized user does not have permission to delete the entry * @return void */ public function DELETEitem( $id ) { try { - \IPS\blog\Entry::load( $id )->delete(); + $item = \IPS\blog\Entry::load( $id ); + if ( $this->member and !$item->canDelete( $this->member ) ) + { + throw new \IPS\Api\Exception( 'NO_PERMISSION', '2B300/C', 404 ); + } + + $item->delete(); return new \IPS\Api\Response( 200, NULL ); } diff --git a/applications/blog/data/emails.xml b/applications/blog/data/emails.xml index cd2e6b5e..e5e51e70 100644 --- a/applications/blog/data/emails.xml +++ b/applications/blog/data/emails.xml @@ -26,7 +26,7 @@

]]>$entry, $emaillanguage->addToStack("x_created_entry_in", FALSE, array( 'sprintf' => array( $entry->author()->name, $entry->container()->_title ) ) )}: {$entry->title} ({$entry->url()}) -]]> +]]>0 diff --git a/applications/blog/data/javascript.xml b/applications/blog/data/javascript.xml index 217b7a0d..31dfc765 100644 --- a/applications/blog/data/javascript.xml +++ b/applications/blog/data/javascript.xml @@ -1,6 +1,43 @@ - /** + 0 ){ + return; + } + + if( $( e.target ).closest('input').length > 0 ){ + return; + } + + window.location = link.attr('href'); + } + }); +}(jQuery, _));]]> + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * diff --git a/applications/blog/data/lang.xml b/applications/blog/data/lang.xml index c4056689..62ea2fcb 100644 --- a/applications/blog/data/lang.xml +++ b/applications/blog/data/lang.xml @@ -1,6 +1,6 @@ - + Blogs Blogs a comment on a blog entry @@ -34,6 +34,13 @@ Allow RSS imports Allow RSS exports Custom RSS Feed]]> + Enable grid view + Grid view showcases blog entries as cards with space for a feature photo + Default view + Grid of latest entries + Displays entries as cards in a grid with space for a feature photo + List of blogs + Displays blogs as a sortable and filterable list Blogs Blog Name Blog Author @@ -54,6 +61,8 @@ Select Blog This Blog This Entry + View Blogs + View Latest Entries Blog Settings Name Name @@ -80,7 +89,7 @@ Submit New Blog Entry Title Tags - Auto Follow + Notify me when other comments are posted Content Publish Time @@ -157,6 +166,7 @@ Unpin A blog by %s A group blog by %s + A club blog for %s Contributors to this blog {# [1:contributor][?:contributors]} to this blog About this blog @@ -212,7 +222,7 @@ Can unhide entries? Can view hidden entries? Can move entries? - Will be able to move entries only between the blogs they have permission to moderate, not to any other blog. + Will be able to move entries only between the blogs they can create new content within. Can lock entries? Can unlock entries? Can reply to locked entries? @@ -257,5 +267,6 @@ Blog Information Blog Member has a Blog? + Feature Photo diff --git a/applications/blog/data/schema.json b/applications/blog/data/schema.json index a442d225..9bdb485b 100644 --- a/applications/blog/data/schema.json +++ b/applications/blog/data/schema.json @@ -449,7 +449,9 @@ ] } }, - "collation": "utf8mb4_unicode_ci" + "collation": "utf8mb4_unicode_ci", + "comment": "", + "reporting": "count" }, "blog_entries": { "name": "blog_entries", @@ -991,8 +993,22 @@ "length": [ null ] + }, + "entry_author_id": { + "type": "key", + "name": "entry_author_id", + "columns": [ + "entry_author_id", + "entry_last_update" + ], + "length": [ + null, + null + ] } - } + }, + "comment": "", + "reporting": "count" }, "blog_comments": { "name": "blog_comments", @@ -1219,7 +1235,9 @@ null ] } - } + }, + "comment": "", + "reporting": "count" }, "blog_rss_import": { "name": "blog_rss_import", @@ -1395,7 +1413,8 @@ ] } }, - "comment": "" + "comment": "", + "reporting": "count" }, "blog_rss_imported": { "name": "blog_rss_imported", diff --git a/applications/blog/data/settings.json b/applications/blog/data/settings.json index c3c9a664..e0021d2a 100644 --- a/applications/blog/data/settings.json +++ b/applications/blog/data/settings.json @@ -1,18 +1,32 @@ [ + { + "key": "blog_allow_grid", + "default": "1", + "report": "full" + }, { "key": "blog_allow_rss", - "default": "1" + "default": "1", + "report": "full" }, { "key": "blog_allow_rssimport", - "default": "1" + "default": "1", + "report": "full" }, { "key": "blog_enable_rating", - "default": "0" + "default": "0", + "report": "full" }, { "key": "blog_enable_sidebar", - "default": "0" + "default": "0", + "report": "full" + }, + { + "key": "blog_view_mode", + "default": "grid", + "report": "bool" } ] \ No newline at end of file diff --git a/applications/blog/data/theme.xml b/applications/blog/data/theme.xml index c2657a41..6fd7fedd 100644 --- a/applications/blog/data/theme.xml +++ b/applications/blog/data/theme.xml @@ -5,52 +5,59 @@

{lang="featured_entries"}

-
    - {{foreach $featured as $entry}} -
  • -
    - {template="userPhoto" group="global" app="core" params="$entry->author(), 'small'"} -
    -

    - - - {{if $entry->unread()}} - - {{endif}} - {$entry->mapped('title')} - - -

    -

    {lang="byline_nodate" htmlsprintf="$entry->author()->link()"} {datetime="$entry->mapped('date')"}

    -
    - {$entry->truncated( true )|raw} +
    +
      + {{foreach $featured as $entry}} +
    • +
      + {template="userPhoto" group="global" app="core" params="$entry->author(), 'small'"} +
      +

      + + + {{if $entry->unread()}} + + {{endif}} + {$entry->mapped('title')} + + +

      +

      {lang="byline_nodate" htmlsprintf="$entry->author()->link()"} {datetime="$entry->mapped('date')"}

      +
      + {$entry->truncated( true )|raw} +
      +
        + {{foreach $entry->stats(TRUE) as $k => $v}} +
      • hotStats )}}class="ipsDataItem_stats_hot" data-text='{lang="hot_item"}' data-ipsTooltip title='{lang="hot_item_desc"}'{{endif}}> + {number="$v"} + {lang="blog_{$k}" pluralize="$v"} +
      • + {{endforeach}} +
      -
        - {{foreach $entry->stats(TRUE) as $k => $v}} -
      • hotStats )}}class="ipsDataItem_stats_hot" data-text='{lang="hot_item"}' data-ipsTooltip title='{lang="hot_item_desc"}'{{endif}}> - {number="$v"} - {lang="blog_{$k}" pluralize="$v"} -
      • - {{endforeach}} -
      -
    -
  • - {{endforeach}} -
+ + {{endforeach}} + +
]]> - + - diff --git a/applications/calendar/data/javascript.xml b/applications/calendar/data/javascript.xml index 174c5317..54a9491d 100644 --- a/applications/calendar/data/javascript.xml +++ b/applications/calendar/data/javascript.xml @@ -1,6 +1,6 @@ - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -969,7 +1004,7 @@ }); }(jQuery, _)); - - + Calendar Calendar a comment on a calendar event @@ -64,7 +64,7 @@ Or specify a custom date format Date format for events Custom date format - PHP strftime options to specify a custom format for dates in calendar]]> + PHP strftime options to specify a custom format for dates in calendar]]> You must either choose a predefined date format or specify a custom date format Calendars Calendar @@ -95,7 +95,7 @@ Can feature events? Can unfeature events? Can move events? - Will be able to move events only between the calendars they have permission to moderate, not to any other calendar. + Will be able to move events only between the calendars they can create new content within. Can lock events? Can unlock events? Can comment on locked events? @@ -204,6 +204,7 @@ Members who are allowed to RSVP for events will be asked to do so and will be able to see the list of members who have RSVP'd for this event. For recurring events, responses apply to all occurrences. to This is an all day event + There is no end time Repeat Change the time zone Event Time Zone @@ -432,6 +433,7 @@ Venues Venues Venue Name + Event Venue Venue Venue not listed Address @@ -467,6 +469,7 @@ {{week}} {{days}} Doesn't repeat {{startDate}}, from {{startTime}} to {{endTime}}]]> + {{startDate}}, at {{startTime}}]]> {{startDate}} (all day)]]> {{startDate}} at {{startTime}} until {{endDate}} at {{endTime}}]]> {{startDate}} to {{endDate}}]]> diff --git a/applications/calendar/data/schema.json b/applications/calendar/data/schema.json index 42c14e25..c7a08ffa 100644 --- a/applications/calendar/data/schema.json +++ b/applications/calendar/data/schema.json @@ -181,7 +181,9 @@ "cal_allow_reviews": "0", "cal_review_moderate": "0" } - ] + ], + "comment": "", + "reporting": "count" }, "calendar_event_comments": { "name": "calendar_event_comments", @@ -392,7 +394,9 @@ null ] } - } + }, + "comment": "", + "reporting": "count" }, "calendar_event_rsvp": { "name": "calendar_event_rsvp", @@ -498,8 +502,22 @@ "columns": [ "rsvp_member_id" ] + }, + "rsvp_search": { + "type": "key", + "name": "rsvp_search", + "columns": [ + "rsvp_date", + "rsvp_member_id" + ], + "length": [ + null, + null + ] } - } + }, + "comment": "", + "reporting": "count" }, "calendar_events": { "name": "calendar_events", @@ -1111,10 +1129,26 @@ "length": [ null ] + }, + "event_album": { + "type": "key", + "name": "event_album", + "columns": [ + "event_album", + "event_approved", + "event_saved" + ], + "length": [ + null, + null, + null + ] } }, "collation": "utf8mb4_unicode_ci", - "engine": "InnoDB" + "engine": "InnoDB", + "comment": "", + "reporting": "count" }, "calendar_import_feeds": { "name": "calendar_import_feeds", @@ -1291,7 +1325,9 @@ "feed_last_run" ] } - } + }, + "comment": "", + "reporting": "count" }, "calendar_import_map": { "name": "calendar_import_map", @@ -1609,6 +1645,20 @@ "unsigned": false, "values": [], "zerofill": false + }, + "review_author_response": { + "name": "review_author_response", + "type": "MEDIUMTEXT", + "length": null, + "decimals": null, + "values": null, + "allow_null": true, + "default": null, + "comment": "", + "unsigned": false, + "zerofill": false, + "auto_increment": false, + "binary": false } }, "indexes": { @@ -1635,11 +1685,13 @@ "review_mid": { "type": "key", "name": "review_mid", - "length": [ - null - ], "columns": [ - "review_mid" + "review_mid", + "review_date" + ], + "length": [ + null, + null ] }, "review_ip": { @@ -1662,7 +1714,9 @@ null ] } - } + }, + "comment": "", + "reporting": "count" }, "calendar_event_reminders": { "name": "calendar_event_reminders", @@ -1858,6 +1912,8 @@ "venue_id" ] } - } + }, + "comment": "", + "reporting": "count" } } \ No newline at end of file diff --git a/applications/calendar/data/settings.json b/applications/calendar/data/settings.json index ab2e0e78..9a076fbe 100644 --- a/applications/calendar/data/settings.json +++ b/applications/calendar/data/settings.json @@ -1,38 +1,47 @@ [ { "key": "all_activity_calendar_streamitems", - "default": "1" + "default": "1", + "report": "full" }, { "key": "calendar_date_format", - "default": "d_lm_y" + "default": "d_lm_y", + "report": "full" }, { "key": "calendar_date_format_custom", - "default": "" + "default": "", + "report": "bool" }, { "key": "calendar_default_view", - "default": "month" + "default": "month", + "report": "full" }, { "key": "calendar_rss_feed", - "default": "1" + "default": "1", + "report": "full" }, { "key": "calendar_rss_feed_days", - "default": "30" + "default": "30", + "report": "full" }, { "key": "calendar_venues_enabled", - "default": "0" + "default": "0", + "report": "full" }, { "key": "ipb_calendar_mon", - "default": "1" + "default": "1", + "report": "full" }, { "key": "show_bday_calendar", - "default": "1" + "default": "1", + "report": "full" } ] \ No newline at end of file diff --git a/applications/calendar/data/theme.xml b/applications/calendar/data/theme.xml index fffdbae3..46c19516 100644 --- a/applications/calendar/data/theme.xml +++ b/applications/calendar/data/theme.xml @@ -167,13 +167,15 @@

{lang="featured_events"}

-
    - {{foreach $featured as $event}} -
  • - {template="eventBlock" app="calendar" group="view" params="$event, $date, true, false"} -
  • - {{endforeach}} -
+
+
    + {{foreach $featured as $event}} +
  • + {template="eventBlock" app="calendar" group="view" params="$event, $date, true, false"} +
  • + {{endforeach}} +
+
@@ -219,7 +221,11 @@
    @@ -282,7 +288,7 @@
    • {{foreach $events[ $date->year . '-' . $date->mon . '-' . $k ]['ranged'] as $event }} -
    • nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ), 'startDate' )->mysqlDatetime( FALSE ) == $date->year . '-' . $date->mon . '-' . $k }}{{$startDates[ $event->id ] = $date->year . '-' . $date->mon . '-' . $k;}} cEvents_first{{endif}}{{if $event->nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ) ?: $event->nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ), 'startDate' ), 'endDate' ) AND $event->nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ) ?: $event->nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ), 'startDate' ), 'endDate' )->mysqlDatetime( FALSE ) == $date->year . '-' . $date->mon . '-' . $k }} cEvents_last{{endif}}' data-eventID='{$event->id}'> +
    • nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ), 'startDate' )->mysqlDatetime( FALSE, TRUE ) == $date->year . '-' . $date->mon . '-' . $k }}{{$startDates[ $event->id ] = $date->year . '-' . $date->mon . '-' . $k;}} cEvents_first{{endif}}{{if $event->nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ) ?: $event->nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ), 'startDate' ), 'endDate' ) AND $event->nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ) ?: $event->nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, $k ), 'startDate' ), 'endDate' )->mysqlDatetime( FALSE, TRUE ) == $date->year . '-' . $date->mon . '-' . $k }} cEvents_last{{endif}}' data-eventID='{$event->id}'> setQuerystring( 'sd', isset( $startDates[ $event->id ] ) ? $startDates[ $event->id ] : $date->year . '-' . $date->mon . '-' . $k )}' title='{$event->title}'>{{if !$event->all_day}}{$event->_start_date->localeTime( FALSE )} {{endif}}{truncate="$event->title" length="15"}{{if $event->hidden() === 1}} {{endif}}
    • {{endforeach}} @@ -425,7 +431,7 @@
      • {{foreach $events[ $day->year . '-' . $day->mon . '-' . $day->mday ]['ranged'] as $event }} -
      • nextOccurrence( $day, 'startDate' )->mysqlDatetime( FALSE ) == $day->mysqlDatetime( FALSE ) }}{{$startDates[ $event->id ] = $day->mysqlDatetime( FALSE );}} cEvents_first{{endif}}{{if $event->nextOccurrence( $day ?: $event->nextOccurrence( $day, 'startDate' ), 'endDate' ) AND $event->nextOccurrence( $day ?: $event->nextOccurrence( $day, 'startDate' ), 'endDate' )->mysqlDatetime( FALSE ) == $day->mysqlDatetime( FALSE ) }} cEvents_last{{endif}}'> +
      • nextOccurrence( $day, 'startDate' )->mysqlDatetime( FALSE, TRUE ) == $day->mysqlDatetime( FALSE ) }}{{$startDates[ $event->id ] = $day->mysqlDatetime( FALSE );}} cEvents_first{{endif}}{{if $event->nextOccurrence( $day ?: $event->nextOccurrence( $day, 'startDate' ), 'endDate' ) AND $event->nextOccurrence( $day ?: $event->nextOccurrence( $day, 'startDate' ), 'endDate' )->mysqlDatetime( FALSE, TRUE ) == $day->mysqlDatetime( FALSE ) }} cEvents_last{{endif}}'> setQuerystring( 'sd', isset( $startDates[ $event->id ] ) ? $startDates[ $event->id ] : $day->mysqlDatetime( FALSE ) )}'>{$event->title}{{if $event->hidden() === 1}} {{endif}}
      • {{endforeach}} @@ -459,7 +465,7 @@ - + diff --git a/applications/core/data/emoji.json b/applications/core/data/emoji.json new file mode 100644 index 00000000..33db2b5d --- /dev/null +++ b/applications/core/data/emoji.json @@ -0,0 +1,13933 @@ +{ + "smileys_people": [ + { + "code": "1F600", + "name": "grinning", + "skinTone": false, + "shortNames": [ + "grinning" + ], + "ascii": [] + }, + { + "code": "1F601", + "name": "grin", + "skinTone": false, + "shortNames": [ + "grin" + ], + "ascii": [] + }, + { + "code": "1F602", + "name": "joy", + "skinTone": false, + "shortNames": [ + "joy" + ], + "ascii": [] + }, + { + "code": "1F923", + "name": "rolling_on_the_floor_laughing", + "skinTone": false, + "shortNames": [ + "rolling_on_the_floor_laughing" + ], + "ascii": [] + }, + { + "code": "1F603", + "name": "smiley", + "skinTone": false, + "shortNames": [ + "smiley" + ], + "ascii": [ + "=)", + "=-)" + ] + }, + { + "code": "1F604", + "name": "smile", + "skinTone": false, + "shortNames": [ + "smile" + ], + "ascii": [ + "C:", + "c:", + ":D", + ":-D" + ] + }, + { + "code": "1F605", + "name": "sweat_smile", + "skinTone": false, + "shortNames": [ + "sweat_smile" + ], + "ascii": [] + }, + { + "code": "1F606", + "name": "laughing", + "skinTone": false, + "shortNames": [ + "laughing", + "satisfied" + ], + "ascii": [ + ":>", + ":->" + ] + }, + { + "code": "1F609", + "name": "wink", + "skinTone": false, + "shortNames": [ + "wink" + ], + "ascii": [ + ";)", + ";-)" + ] + }, + { + "code": "1F60A", + "name": "blush", + "skinTone": false, + "shortNames": [ + "blush" + ], + "ascii": [] + }, + { + "code": "1F60B", + "name": "yum", + "skinTone": false, + "shortNames": [ + "yum" + ], + "ascii": [] + }, + { + "code": "1F60E", + "name": "sunglasses", + "skinTone": false, + "shortNames": [ + "sunglasses" + ], + "ascii": [ + "8)" + ] + }, + { + "code": "1F60D", + "name": "heart_eyes", + "skinTone": false, + "shortNames": [ + "heart_eyes" + ], + "ascii": [] + }, + { + "code": "1F618", + "name": "kissing_heart", + "skinTone": false, + "shortNames": [ + "kissing_heart" + ], + "ascii": [ + ":*", + ":-*" + ] + }, + { + "code": "1F617", + "name": "kissing", + "skinTone": false, + "shortNames": [ + "kissing" + ], + "ascii": [] + }, + { + "code": "1F619", + "name": "kissing_smiling_eyes", + "skinTone": false, + "shortNames": [ + "kissing_smiling_eyes" + ], + "ascii": [] + }, + { + "code": "1F61A", + "name": "kissing_closed_eyes", + "skinTone": false, + "shortNames": [ + "kissing_closed_eyes" + ], + "ascii": [] + }, + { + "code": "263A-FE0F", + "name": "relaxed", + "skinTone": false, + "shortNames": [ + "relaxed" + ], + "ascii": [] + }, + { + "code": "1F642", + "name": "slightly_smiling_face", + "skinTone": false, + "shortNames": [ + "slightly_smiling_face" + ], + "ascii": [ + ":)", + "(:", + ":-)" + ] + }, + { + "code": "1F917", + "name": "hugging_face", + "skinTone": false, + "shortNames": [ + "hugging_face" + ], + "ascii": [] + }, + { + "code": "1F929", + "name": "grinning_face_with_star_eyes", + "skinTone": false, + "shortNames": [ + "grinning_face_with_star_eyes" + ], + "ascii": [] + }, + { + "code": "1F914", + "name": "thinking_face", + "skinTone": false, + "shortNames": [ + "thinking_face" + ], + "ascii": [] + }, + { + "code": "1F928", + "name": "face_with_one_eyebrow_raised", + "skinTone": false, + "shortNames": [ + "face_with_one_eyebrow_raised" + ], + "ascii": [] + }, + { + "code": "1F610", + "name": "neutral_face", + "skinTone": false, + "shortNames": [ + "neutral_face" + ], + "ascii": [ + ":|", + ":-|" + ] + }, + { + "code": "1F611", + "name": "expressionless", + "skinTone": false, + "shortNames": [ + "expressionless" + ], + "ascii": [] + }, + { + "code": "1F636", + "name": "no_mouth", + "skinTone": false, + "shortNames": [ + "no_mouth" + ], + "ascii": [] + }, + { + "code": "1F644", + "name": "face_with_rolling_eyes", + "skinTone": false, + "shortNames": [ + "face_with_rolling_eyes" + ], + "ascii": [] + }, + { + "code": "1F60F", + "name": "smirk", + "skinTone": false, + "shortNames": [ + "smirk" + ], + "ascii": [] + }, + { + "code": "1F623", + "name": "persevere", + "skinTone": false, + "shortNames": [ + "persevere" + ], + "ascii": [] + }, + { + "code": "1F625", + "name": "disappointed_relieved", + "skinTone": false, + "shortNames": [ + "disappointed_relieved" + ], + "ascii": [] + }, + { + "code": "1F62E", + "name": "open_mouth", + "skinTone": false, + "shortNames": [ + "open_mouth" + ], + "ascii": [ + ":o", + ":-o", + ":O", + ":-O" + ] + }, + { + "code": "1F910", + "name": "zipper_mouth_face", + "skinTone": false, + "shortNames": [ + "zipper_mouth_face" + ], + "ascii": [] + }, + { + "code": "1F62F", + "name": "hushed", + "skinTone": false, + "shortNames": [ + "hushed" + ], + "ascii": [] + }, + { + "code": "1F62A", + "name": "sleepy", + "skinTone": false, + "shortNames": [ + "sleepy" + ], + "ascii": [] + }, + { + "code": "1F62B", + "name": "tired_face", + "skinTone": false, + "shortNames": [ + "tired_face" + ], + "ascii": [] + }, + { + "code": "1F634", + "name": "sleeping", + "skinTone": false, + "shortNames": [ + "sleeping" + ], + "ascii": [] + }, + { + "code": "1F60C", + "name": "relieved", + "skinTone": false, + "shortNames": [ + "relieved" + ], + "ascii": [] + }, + { + "code": "1F61B", + "name": "stuck_out_tongue", + "skinTone": false, + "shortNames": [ + "stuck_out_tongue" + ], + "ascii": [ + ":p", + ":-p", + ":P", + ":-P", + ":b", + ":-b" + ] + }, + { + "code": "1F61C", + "name": "stuck_out_tongue_winking_eye", + "skinTone": false, + "shortNames": [ + "stuck_out_tongue_winking_eye" + ], + "ascii": [ + ";p", + ";-p", + ";b", + ";-b", + ";P", + ";-P" + ] + }, + { + "code": "1F61D", + "name": "stuck_out_tongue_closed_eyes", + "skinTone": false, + "shortNames": [ + "stuck_out_tongue_closed_eyes" + ], + "ascii": [] + }, + { + "code": "1F924", + "name": "drooling_face", + "skinTone": false, + "shortNames": [ + "drooling_face" + ], + "ascii": [] + }, + { + "code": "1F612", + "name": "unamused", + "skinTone": false, + "shortNames": [ + "unamused" + ], + "ascii": [] + }, + { + "code": "1F613", + "name": "sweat", + "skinTone": false, + "shortNames": [ + "sweat" + ], + "ascii": [] + }, + { + "code": "1F614", + "name": "pensive", + "skinTone": false, + "shortNames": [ + "pensive" + ], + "ascii": [] + }, + { + "code": "1F615", + "name": "confused", + "skinTone": false, + "shortNames": [ + "confused" + ], + "ascii": [ + ":\\", + ":-\\", + ":\/", + ":-\/" + ] + }, + { + "code": "1F643", + "name": "upside_down_face", + "skinTone": false, + "shortNames": [ + "upside_down_face" + ], + "ascii": [] + }, + { + "code": "1F911", + "name": "money_mouth_face", + "skinTone": false, + "shortNames": [ + "money_mouth_face" + ], + "ascii": [] + }, + { + "code": "1F632", + "name": "astonished", + "skinTone": false, + "shortNames": [ + "astonished" + ], + "ascii": [] + }, + { + "code": "2639-FE0F", + "name": "white_frowning_face", + "skinTone": false, + "shortNames": [ + "white_frowning_face" + ], + "ascii": [] + }, + { + "code": "1F641", + "name": "slightly_frowning_face", + "skinTone": false, + "shortNames": [ + "slightly_frowning_face" + ], + "ascii": [] + }, + { + "code": "1F616", + "name": "confounded", + "skinTone": false, + "shortNames": [ + "confounded" + ], + "ascii": [] + }, + { + "code": "1F61E", + "name": "disappointed", + "skinTone": false, + "shortNames": [ + "disappointed" + ], + "ascii": [ + "):", + ":(", + ":-(" + ] + }, + { + "code": "1F61F", + "name": "worried", + "skinTone": false, + "shortNames": [ + "worried" + ], + "ascii": [] + }, + { + "code": "1F624", + "name": "triumph", + "skinTone": false, + "shortNames": [ + "triumph" + ], + "ascii": [] + }, + { + "code": "1F622", + "name": "cry", + "skinTone": false, + "shortNames": [ + "cry" + ], + "ascii": [ + ":'(" + ] + }, + { + "code": "1F62D", + "name": "sob", + "skinTone": false, + "shortNames": [ + "sob" + ], + "ascii": [] + }, + { + "code": "1F626", + "name": "frowning", + "skinTone": false, + "shortNames": [ + "frowning" + ], + "ascii": [] + }, + { + "code": "1F627", + "name": "anguished", + "skinTone": false, + "shortNames": [ + "anguished" + ], + "ascii": [ + "D:" + ] + }, + { + "code": "1F628", + "name": "fearful", + "skinTone": false, + "shortNames": [ + "fearful" + ], + "ascii": [] + }, + { + "code": "1F629", + "name": "weary", + "skinTone": false, + "shortNames": [ + "weary" + ], + "ascii": [] + }, + { + "code": "1F92F", + "name": "shocked_face_with_exploding_head", + "skinTone": false, + "shortNames": [ + "shocked_face_with_exploding_head" + ], + "ascii": [] + }, + { + "code": "1F62C", + "name": "grimacing", + "skinTone": false, + "shortNames": [ + "grimacing" + ], + "ascii": [] + }, + { + "code": "1F630", + "name": "cold_sweat", + "skinTone": false, + "shortNames": [ + "cold_sweat" + ], + "ascii": [] + }, + { + "code": "1F631", + "name": "scream", + "skinTone": false, + "shortNames": [ + "scream" + ], + "ascii": [] + }, + { + "code": "1F633", + "name": "flushed", + "skinTone": false, + "shortNames": [ + "flushed" + ], + "ascii": [] + }, + { + "code": "1F92A", + "name": "grinning_face_with_one_large_and_one_small_eye", + "skinTone": false, + "shortNames": [ + "grinning_face_with_one_large_and_one_small_eye" + ], + "ascii": [] + }, + { + "code": "1F635", + "name": "dizzy_face", + "skinTone": false, + "shortNames": [ + "dizzy_face" + ], + "ascii": [] + }, + { + "code": "1F621", + "name": "rage", + "skinTone": false, + "shortNames": [ + "rage" + ], + "ascii": [] + }, + { + "code": "1F620", + "name": "angry", + "skinTone": false, + "shortNames": [ + "angry" + ], + "ascii": [ + ">:(", + ">:-(" + ] + }, + { + "code": "1F92C", + "name": "serious_face_with_symbols_covering_mouth", + "skinTone": false, + "shortNames": [ + "serious_face_with_symbols_covering_mouth" + ], + "ascii": [] + }, + { + "code": "1F637", + "name": "mask", + "skinTone": false, + "shortNames": [ + "mask" + ], + "ascii": [] + }, + { + "code": "1F912", + "name": "face_with_thermometer", + "skinTone": false, + "shortNames": [ + "face_with_thermometer" + ], + "ascii": [] + }, + { + "code": "1F915", + "name": "face_with_head_bandage", + "skinTone": false, + "shortNames": [ + "face_with_head_bandage" + ], + "ascii": [] + }, + { + "code": "1F922", + "name": "nauseated_face", + "skinTone": false, + "shortNames": [ + "nauseated_face" + ], + "ascii": [] + }, + { + "code": "1F92E", + "name": "face_with_open_mouth_vomiting", + "skinTone": false, + "shortNames": [ + "face_with_open_mouth_vomiting" + ], + "ascii": [] + }, + { + "code": "1F927", + "name": "sneezing_face", + "skinTone": false, + "shortNames": [ + "sneezing_face" + ], + "ascii": [] + }, + { + "code": "1F607", + "name": "innocent", + "skinTone": false, + "shortNames": [ + "innocent" + ], + "ascii": [] + }, + { + "code": "1F920", + "name": "face_with_cowboy_hat", + "skinTone": false, + "shortNames": [ + "face_with_cowboy_hat" + ], + "ascii": [] + }, + { + "code": "1F921", + "name": "clown_face", + "skinTone": false, + "shortNames": [ + "clown_face" + ], + "ascii": [] + }, + { + "code": "1F925", + "name": "lying_face", + "skinTone": false, + "shortNames": [ + "lying_face" + ], + "ascii": [] + }, + { + "code": "1F92B", + "name": "face_with_finger_covering_closed_lips", + "skinTone": false, + "shortNames": [ + "face_with_finger_covering_closed_lips" + ], + "ascii": [] + }, + { + "code": "1F92D", + "name": "smiling_face_with_smiling_eyes_and_hand_covering_mouth", + "skinTone": false, + "shortNames": [ + "smiling_face_with_smiling_eyes_and_hand_covering_mouth" + ], + "ascii": [] + }, + { + "code": "1F9D0", + "name": "face_with_monocle", + "skinTone": false, + "shortNames": [ + "face_with_monocle" + ], + "ascii": [] + }, + { + "code": "1F913", + "name": "nerd_face", + "skinTone": false, + "shortNames": [ + "nerd_face" + ], + "ascii": [] + }, + { + "code": "1F608", + "name": "smiling_imp", + "skinTone": false, + "shortNames": [ + "smiling_imp" + ], + "ascii": [] + }, + { + "code": "1F47F", + "name": "imp", + "skinTone": false, + "shortNames": [ + "imp" + ], + "ascii": [] + }, + { + "code": "1F479", + "name": "japanese_ogre", + "skinTone": false, + "shortNames": [ + "japanese_ogre" + ], + "ascii": [] + }, + { + "code": "1F47A", + "name": "japanese_goblin", + "skinTone": false, + "shortNames": [ + "japanese_goblin" + ], + "ascii": [] + }, + { + "code": "1F480", + "name": "skull", + "skinTone": false, + "shortNames": [ + "skull" + ], + "ascii": [] + }, + { + "code": "2620-FE0F", + "name": "skull_and_crossbones", + "skinTone": false, + "shortNames": [ + "skull_and_crossbones" + ], + "ascii": [] + }, + { + "code": "1F47B", + "name": "ghost", + "skinTone": false, + "shortNames": [ + "ghost" + ], + "ascii": [] + }, + { + "code": "1F47D", + "name": "alien", + "skinTone": false, + "shortNames": [ + "alien" + ], + "ascii": [] + }, + { + "code": "1F47E", + "name": "space_invader", + "skinTone": false, + "shortNames": [ + "space_invader" + ], + "ascii": [] + }, + { + "code": "1F916", + "name": "robot_face", + "skinTone": false, + "shortNames": [ + "robot_face" + ], + "ascii": [] + }, + { + "code": "1F4A9", + "name": "hankey", + "skinTone": false, + "shortNames": [ + "hankey", + "poop", + "shit" + ], + "ascii": [] + }, + { + "code": "1F63A", + "name": "smiley_cat", + "skinTone": false, + "shortNames": [ + "smiley_cat" + ], + "ascii": [] + }, + { + "code": "1F638", + "name": "smile_cat", + "skinTone": false, + "shortNames": [ + "smile_cat" + ], + "ascii": [] + }, + { + "code": "1F639", + "name": "joy_cat", + "skinTone": false, + "shortNames": [ + "joy_cat" + ], + "ascii": [] + }, + { + "code": "1F63B", + "name": "heart_eyes_cat", + "skinTone": false, + "shortNames": [ + "heart_eyes_cat" + ], + "ascii": [] + }, + { + "code": "1F63C", + "name": "smirk_cat", + "skinTone": false, + "shortNames": [ + "smirk_cat" + ], + "ascii": [] + }, + { + "code": "1F63D", + "name": "kissing_cat", + "skinTone": false, + "shortNames": [ + "kissing_cat" + ], + "ascii": [] + }, + { + "code": "1F640", + "name": "scream_cat", + "skinTone": false, + "shortNames": [ + "scream_cat" + ], + "ascii": [] + }, + { + "code": "1F63F", + "name": "crying_cat_face", + "skinTone": false, + "shortNames": [ + "crying_cat_face" + ], + "ascii": [] + }, + { + "code": "1F63E", + "name": "pouting_cat", + "skinTone": false, + "shortNames": [ + "pouting_cat" + ], + "ascii": [] + }, + { + "code": "1F648", + "name": "see_no_evil", + "skinTone": false, + "shortNames": [ + "see_no_evil" + ], + "ascii": [] + }, + { + "code": "1F649", + "name": "hear_no_evil", + "skinTone": false, + "shortNames": [ + "hear_no_evil" + ], + "ascii": [] + }, + { + "code": "1F64A", + "name": "speak_no_evil", + "skinTone": false, + "shortNames": [ + "speak_no_evil" + ], + "ascii": [] + }, + { + "code": "1F476", + "name": "baby", + "skinTone": true, + "shortNames": [ + "baby" + ], + "ascii": [] + }, + { + "code": "1F9D2", + "name": "child", + "skinTone": true, + "shortNames": [ + "child" + ], + "ascii": [] + }, + { + "code": "1F466", + "name": "boy", + "skinTone": true, + "shortNames": [ + "boy" + ], + "ascii": [] + }, + { + "code": "1F467", + "name": "girl", + "skinTone": true, + "shortNames": [ + "girl" + ], + "ascii": [] + }, + { + "code": "1F9D1", + "name": "adult", + "skinTone": true, + "shortNames": [ + "adult" + ], + "ascii": [] + }, + { + "code": "1F468", + "name": "man", + "skinTone": true, + "shortNames": [ + "man" + ], + "ascii": [] + }, + { + "code": "1F469", + "name": "woman", + "skinTone": true, + "shortNames": [ + "woman" + ], + "ascii": [] + }, + { + "code": "1F9D3", + "name": "older_adult", + "skinTone": true, + "shortNames": [ + "older_adult" + ], + "ascii": [] + }, + { + "code": "1F474", + "name": "older_man", + "skinTone": true, + "shortNames": [ + "older_man" + ], + "ascii": [] + }, + { + "code": "1F475", + "name": "older_woman", + "skinTone": true, + "shortNames": [ + "older_woman" + ], + "ascii": [] + }, + { + "code": "1F468-200D-2695-FE0F", + "name": "male-doctor", + "skinTone": true, + "shortNames": [ + "male-doctor" + ], + "ascii": [] + }, + { + "code": "1F469-200D-2695-FE0F", + "name": "female-doctor", + "skinTone": true, + "shortNames": [ + "female-doctor" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F393", + "name": "male-student", + "skinTone": true, + "shortNames": [ + "male-student" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F393", + "name": "female-student", + "skinTone": true, + "shortNames": [ + "female-student" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F3EB", + "name": "male-teacher", + "skinTone": true, + "shortNames": [ + "male-teacher" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F3EB", + "name": "female-teacher", + "skinTone": true, + "shortNames": [ + "female-teacher" + ], + "ascii": [] + }, + { + "code": "1F468-200D-2696-FE0F", + "name": "male-judge", + "skinTone": true, + "shortNames": [ + "male-judge" + ], + "ascii": [] + }, + { + "code": "1F469-200D-2696-FE0F", + "name": "female-judge", + "skinTone": true, + "shortNames": [ + "female-judge" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F33E", + "name": "male-farmer", + "skinTone": true, + "shortNames": [ + "male-farmer" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F33E", + "name": "female-farmer", + "skinTone": true, + "shortNames": [ + "female-farmer" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F373", + "name": "male-cook", + "skinTone": true, + "shortNames": [ + "male-cook" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F373", + "name": "female-cook", + "skinTone": true, + "shortNames": [ + "female-cook" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F527", + "name": "male-mechanic", + "skinTone": true, + "shortNames": [ + "male-mechanic" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F527", + "name": "female-mechanic", + "skinTone": true, + "shortNames": [ + "female-mechanic" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F3ED", + "name": "male-factory-worker", + "skinTone": true, + "shortNames": [ + "male-factory-worker" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F3ED", + "name": "female-factory-worker", + "skinTone": true, + "shortNames": [ + "female-factory-worker" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F4BC", + "name": "male-office-worker", + "skinTone": true, + "shortNames": [ + "male-office-worker" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F4BC", + "name": "female-office-worker", + "skinTone": true, + "shortNames": [ + "female-office-worker" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F52C", + "name": "male-scientist", + "skinTone": true, + "shortNames": [ + "male-scientist" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F52C", + "name": "female-scientist", + "skinTone": true, + "shortNames": [ + "female-scientist" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F4BB", + "name": "male-technologist", + "skinTone": true, + "shortNames": [ + "male-technologist" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F4BB", + "name": "female-technologist", + "skinTone": true, + "shortNames": [ + "female-technologist" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F3A4", + "name": "male-singer", + "skinTone": true, + "shortNames": [ + "male-singer" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F3A4", + "name": "female-singer", + "skinTone": true, + "shortNames": [ + "female-singer" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F3A8", + "name": "male-artist", + "skinTone": true, + "shortNames": [ + "male-artist" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F3A8", + "name": "female-artist", + "skinTone": true, + "shortNames": [ + "female-artist" + ], + "ascii": [] + }, + { + "code": "1F468-200D-2708-FE0F", + "name": "male-pilot", + "skinTone": true, + "shortNames": [ + "male-pilot" + ], + "ascii": [] + }, + { + "code": "1F469-200D-2708-FE0F", + "name": "female-pilot", + "skinTone": true, + "shortNames": [ + "female-pilot" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F680", + "name": "male-astronaut", + "skinTone": true, + "shortNames": [ + "male-astronaut" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F680", + "name": "female-astronaut", + "skinTone": true, + "shortNames": [ + "female-astronaut" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F692", + "name": "male-firefighter", + "skinTone": true, + "shortNames": [ + "male-firefighter" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F692", + "name": "female-firefighter", + "skinTone": true, + "shortNames": [ + "female-firefighter" + ], + "ascii": [] + }, + { + "code": "1F46E-200D-2642-FE0F", + "name": "male-police-officer", + "skinTone": true, + "shortNames": [ + "male-police-officer" + ], + "ascii": [] + }, + { + "code": "1F46E-200D-2640-FE0F", + "name": "female-police-officer", + "skinTone": true, + "shortNames": [ + "female-police-officer" + ], + "ascii": [] + }, + { + "code": "1F575-FE0F-200D-2642-FE0F", + "name": "male-detective", + "skinTone": true, + "shortNames": [ + "male-detective" + ], + "ascii": [] + }, + { + "code": "1F575-FE0F-200D-2640-FE0F", + "name": "female-detective", + "skinTone": true, + "shortNames": [ + "female-detective" + ], + "ascii": [] + }, + { + "code": "1F482-200D-2642-FE0F", + "name": "male-guard", + "skinTone": true, + "shortNames": [ + "male-guard" + ], + "ascii": [] + }, + { + "code": "1F482-200D-2640-FE0F", + "name": "female-guard", + "skinTone": true, + "shortNames": [ + "female-guard" + ], + "ascii": [] + }, + { + "code": "1F477-200D-2642-FE0F", + "name": "male-construction-worker", + "skinTone": true, + "shortNames": [ + "male-construction-worker" + ], + "ascii": [] + }, + { + "code": "1F477-200D-2640-FE0F", + "name": "female-construction-worker", + "skinTone": true, + "shortNames": [ + "female-construction-worker" + ], + "ascii": [] + }, + { + "code": "1F934", + "name": "prince", + "skinTone": true, + "shortNames": [ + "prince" + ], + "ascii": [] + }, + { + "code": "1F478", + "name": "princess", + "skinTone": true, + "shortNames": [ + "princess" + ], + "ascii": [] + }, + { + "code": "1F473-200D-2642-FE0F", + "name": "man-wearing-turban", + "skinTone": true, + "shortNames": [ + "man-wearing-turban" + ], + "ascii": [] + }, + { + "code": "1F473-200D-2640-FE0F", + "name": "woman-wearing-turban", + "skinTone": true, + "shortNames": [ + "woman-wearing-turban" + ], + "ascii": [] + }, + { + "code": "1F472", + "name": "man_with_gua_pi_mao", + "skinTone": true, + "shortNames": [ + "man_with_gua_pi_mao" + ], + "ascii": [] + }, + { + "code": "1F9D5", + "name": "person_with_headscarf", + "skinTone": true, + "shortNames": [ + "person_with_headscarf" + ], + "ascii": [] + }, + { + "code": "1F9D4", + "name": "bearded_person", + "skinTone": true, + "shortNames": [ + "bearded_person" + ], + "ascii": [] + }, + { + "code": "1F471-200D-2642-FE0F", + "name": "blond-haired-man", + "skinTone": true, + "shortNames": [ + "blond-haired-man" + ], + "ascii": [] + }, + { + "code": "1F471-200D-2640-FE0F", + "name": "blond-haired-woman", + "skinTone": true, + "shortNames": [ + "blond-haired-woman" + ], + "ascii": [] + }, + { + "code": "1F935", + "name": "man_in_tuxedo", + "skinTone": true, + "shortNames": [ + "man_in_tuxedo" + ], + "ascii": [] + }, + { + "code": "1F470", + "name": "bride_with_veil", + "skinTone": true, + "shortNames": [ + "bride_with_veil" + ], + "ascii": [] + }, + { + "code": "1F930", + "name": "pregnant_woman", + "skinTone": true, + "shortNames": [ + "pregnant_woman" + ], + "ascii": [] + }, + { + "code": "1F931", + "name": "breast-feeding", + "skinTone": true, + "shortNames": [ + "breast-feeding" + ], + "ascii": [] + }, + { + "code": "1F47C", + "name": "angel", + "skinTone": true, + "shortNames": [ + "angel" + ], + "ascii": [] + }, + { + "code": "1F385", + "name": "santa", + "skinTone": true, + "shortNames": [ + "santa" + ], + "ascii": [] + }, + { + "code": "1F936", + "name": "mother_christmas", + "skinTone": true, + "shortNames": [ + "mother_christmas" + ], + "ascii": [] + }, + { + "code": "1F9D9-200D-2640-FE0F", + "name": "female_mage", + "skinTone": true, + "shortNames": [ + "female_mage" + ], + "ascii": [] + }, + { + "code": "1F9D9-200D-2642-FE0F", + "name": "male_mage", + "skinTone": true, + "shortNames": [ + "male_mage" + ], + "ascii": [] + }, + { + "code": "1F9DA-200D-2640-FE0F", + "name": "female_fairy", + "skinTone": true, + "shortNames": [ + "female_fairy" + ], + "ascii": [] + }, + { + "code": "1F9DA-200D-2642-FE0F", + "name": "male_fairy", + "skinTone": true, + "shortNames": [ + "male_fairy" + ], + "ascii": [] + }, + { + "code": "1F9DB-200D-2640-FE0F", + "name": "female_vampire", + "skinTone": true, + "shortNames": [ + "female_vampire" + ], + "ascii": [] + }, + { + "code": "1F9DB-200D-2642-FE0F", + "name": "male_vampire", + "skinTone": true, + "shortNames": [ + "male_vampire" + ], + "ascii": [] + }, + { + "code": "1F9DC-200D-2642-FE0F", + "name": "merman", + "skinTone": true, + "shortNames": [ + "merman" + ], + "ascii": [] + }, + { + "code": "1F9DC-200D-2640-FE0F", + "name": "mermaid", + "skinTone": true, + "shortNames": [ + "mermaid" + ], + "ascii": [] + }, + { + "code": "1F9DD-200D-2642-FE0F", + "name": "male_elf", + "skinTone": true, + "shortNames": [ + "male_elf" + ], + "ascii": [] + }, + { + "code": "1F9DD-200D-2640-FE0F", + "name": "female_elf", + "skinTone": true, + "shortNames": [ + "female_elf" + ], + "ascii": [] + }, + { + "code": "1F9DE-200D-2642-FE0F", + "name": "male_genie", + "skinTone": false, + "shortNames": [ + "male_genie" + ], + "ascii": [] + }, + { + "code": "1F9DE-200D-2640-FE0F", + "name": "female_genie", + "skinTone": false, + "shortNames": [ + "female_genie" + ], + "ascii": [] + }, + { + "code": "1F9DF-200D-2642-FE0F", + "name": "male_zombie", + "skinTone": false, + "shortNames": [ + "male_zombie" + ], + "ascii": [] + }, + { + "code": "1F9DF-200D-2640-FE0F", + "name": "female_zombie", + "skinTone": false, + "shortNames": [ + "female_zombie" + ], + "ascii": [] + }, + { + "code": "1F64D-200D-2640-FE0F", + "name": "woman-frowning", + "skinTone": true, + "shortNames": [ + "woman-frowning" + ], + "ascii": [] + }, + { + "code": "1F64D-200D-2642-FE0F", + "name": "man-frowning", + "skinTone": true, + "shortNames": [ + "man-frowning" + ], + "ascii": [] + }, + { + "code": "1F64E-200D-2640-FE0F", + "name": "woman-pouting", + "skinTone": true, + "shortNames": [ + "woman-pouting" + ], + "ascii": [] + }, + { + "code": "1F64E-200D-2642-FE0F", + "name": "man-pouting", + "skinTone": true, + "shortNames": [ + "man-pouting" + ], + "ascii": [] + }, + { + "code": "1F645-200D-2640-FE0F", + "name": "woman-gesturing-no", + "skinTone": true, + "shortNames": [ + "woman-gesturing-no" + ], + "ascii": [] + }, + { + "code": "1F645-200D-2642-FE0F", + "name": "man-gesturing-no", + "skinTone": true, + "shortNames": [ + "man-gesturing-no" + ], + "ascii": [] + }, + { + "code": "1F646-200D-2640-FE0F", + "name": "woman-gesturing-ok", + "skinTone": true, + "shortNames": [ + "woman-gesturing-ok" + ], + "ascii": [] + }, + { + "code": "1F646-200D-2642-FE0F", + "name": "man-gesturing-ok", + "skinTone": true, + "shortNames": [ + "man-gesturing-ok" + ], + "ascii": [] + }, + { + "code": "1F481-200D-2640-FE0F", + "name": "woman-tipping-hand", + "skinTone": true, + "shortNames": [ + "woman-tipping-hand" + ], + "ascii": [] + }, + { + "code": "1F481-200D-2642-FE0F", + "name": "man-tipping-hand", + "skinTone": true, + "shortNames": [ + "man-tipping-hand" + ], + "ascii": [] + }, + { + "code": "1F64B-200D-2640-FE0F", + "name": "woman-raising-hand", + "skinTone": true, + "shortNames": [ + "woman-raising-hand" + ], + "ascii": [] + }, + { + "code": "1F64B-200D-2642-FE0F", + "name": "man-raising-hand", + "skinTone": true, + "shortNames": [ + "man-raising-hand" + ], + "ascii": [] + }, + { + "code": "1F647-200D-2642-FE0F", + "name": "man-bowing", + "skinTone": true, + "shortNames": [ + "man-bowing" + ], + "ascii": [] + }, + { + "code": "1F647-200D-2640-FE0F", + "name": "woman-bowing", + "skinTone": true, + "shortNames": [ + "woman-bowing" + ], + "ascii": [] + }, + { + "code": "1F926-200D-2642-FE0F", + "name": "man-facepalming", + "skinTone": true, + "shortNames": [ + "man-facepalming" + ], + "ascii": [] + }, + { + "code": "1F926-200D-2640-FE0F", + "name": "woman-facepalming", + "skinTone": true, + "shortNames": [ + "woman-facepalming" + ], + "ascii": [] + }, + { + "code": "1F937-200D-2642-FE0F", + "name": "man-shrugging", + "skinTone": true, + "shortNames": [ + "man-shrugging" + ], + "ascii": [] + }, + { + "code": "1F937-200D-2640-FE0F", + "name": "woman-shrugging", + "skinTone": true, + "shortNames": [ + "woman-shrugging" + ], + "ascii": [] + }, + { + "code": "1F486-200D-2640-FE0F", + "name": "woman-getting-massage", + "skinTone": true, + "shortNames": [ + "woman-getting-massage" + ], + "ascii": [] + }, + { + "code": "1F486-200D-2642-FE0F", + "name": "man-getting-massage", + "skinTone": true, + "shortNames": [ + "man-getting-massage" + ], + "ascii": [] + }, + { + "code": "1F487-200D-2640-FE0F", + "name": "woman-getting-haircut", + "skinTone": true, + "shortNames": [ + "woman-getting-haircut" + ], + "ascii": [] + }, + { + "code": "1F487-200D-2642-FE0F", + "name": "man-getting-haircut", + "skinTone": true, + "shortNames": [ + "man-getting-haircut" + ], + "ascii": [] + }, + { + "code": "1F6B6-200D-2642-FE0F", + "name": "man-walking", + "skinTone": true, + "shortNames": [ + "man-walking" + ], + "ascii": [] + }, + { + "code": "1F6B6-200D-2640-FE0F", + "name": "woman-walking", + "skinTone": true, + "shortNames": [ + "woman-walking" + ], + "ascii": [] + }, + { + "code": "1F3C3-200D-2642-FE0F", + "name": "man-running", + "skinTone": true, + "shortNames": [ + "man-running" + ], + "ascii": [] + }, + { + "code": "1F3C3-200D-2640-FE0F", + "name": "woman-running", + "skinTone": true, + "shortNames": [ + "woman-running" + ], + "ascii": [] + }, + { + "code": "1F483", + "name": "dancer", + "skinTone": true, + "shortNames": [ + "dancer" + ], + "ascii": [] + }, + { + "code": "1F57A", + "name": "man_dancing", + "skinTone": true, + "shortNames": [ + "man_dancing" + ], + "ascii": [] + }, + { + "code": "1F46F-200D-2640-FE0F", + "name": "woman-with-bunny-ears-partying", + "skinTone": false, + "shortNames": [ + "woman-with-bunny-ears-partying" + ], + "ascii": [] + }, + { + "code": "1F46F-200D-2642-FE0F", + "name": "man-with-bunny-ears-partying", + "skinTone": false, + "shortNames": [ + "man-with-bunny-ears-partying" + ], + "ascii": [] + }, + { + "code": "1F9D6-200D-2642-FE0F", + "name": "man_in_steamy_room", + "skinTone": true, + "shortNames": [ + "man_in_steamy_room" + ], + "ascii": [] + }, + { + "code": "1F9D6-200D-2640-FE0F", + "name": "woman_in_steamy_room", + "skinTone": true, + "shortNames": [ + "woman_in_steamy_room" + ], + "ascii": [] + }, + { + "code": "1F9D7-200D-2640-FE0F", + "name": "woman_climbing", + "skinTone": true, + "shortNames": [ + "woman_climbing" + ], + "ascii": [] + }, + { + "code": "1F9D7-200D-2642-FE0F", + "name": "man_climbing", + "skinTone": true, + "shortNames": [ + "man_climbing" + ], + "ascii": [] + }, + { + "code": "1F9D8-200D-2640-FE0F", + "name": "woman_in_lotus_position", + "skinTone": true, + "shortNames": [ + "woman_in_lotus_position" + ], + "ascii": [] + }, + { + "code": "1F9D8-200D-2642-FE0F", + "name": "man_in_lotus_position", + "skinTone": true, + "shortNames": [ + "man_in_lotus_position" + ], + "ascii": [] + }, + { + "code": "1F6C0", + "name": "bath", + "skinTone": true, + "shortNames": [ + "bath" + ], + "ascii": [] + }, + { + "code": "1F6CC", + "name": "sleeping_accommodation", + "skinTone": true, + "shortNames": [ + "sleeping_accommodation" + ], + "ascii": [] + }, + { + "code": "1F574-FE0F", + "name": "man_in_business_suit_levitating", + "skinTone": false, + "shortNames": [ + "man_in_business_suit_levitating" + ], + "ascii": [] + }, + { + "code": "1F5E3-FE0F", + "name": "speaking_head_in_silhouette", + "skinTone": false, + "shortNames": [ + "speaking_head_in_silhouette" + ], + "ascii": [] + }, + { + "code": "1F464", + "name": "bust_in_silhouette", + "skinTone": false, + "shortNames": [ + "bust_in_silhouette" + ], + "ascii": [] + }, + { + "code": "1F465", + "name": "busts_in_silhouette", + "skinTone": false, + "shortNames": [ + "busts_in_silhouette" + ], + "ascii": [] + }, + { + "code": "1F93A", + "name": "fencer", + "skinTone": false, + "shortNames": [ + "fencer" + ], + "ascii": [] + }, + { + "code": "1F3C7", + "name": "horse_racing", + "skinTone": true, + "shortNames": [ + "horse_racing" + ], + "ascii": [] + }, + { + "code": "26F7-FE0F", + "name": "skier", + "skinTone": false, + "shortNames": [ + "skier" + ], + "ascii": [] + }, + { + "code": "1F3C2", + "name": "snowboarder", + "skinTone": true, + "shortNames": [ + "snowboarder" + ], + "ascii": [] + }, + { + "code": "1F3CC-FE0F-200D-2642-FE0F", + "name": "man-golfing", + "skinTone": true, + "shortNames": [ + "man-golfing" + ], + "ascii": [] + }, + { + "code": "1F3CC-FE0F-200D-2640-FE0F", + "name": "woman-golfing", + "skinTone": true, + "shortNames": [ + "woman-golfing" + ], + "ascii": [] + }, + { + "code": "1F3C4-200D-2642-FE0F", + "name": "man-surfing", + "skinTone": true, + "shortNames": [ + "man-surfing" + ], + "ascii": [] + }, + { + "code": "1F3C4-200D-2640-FE0F", + "name": "woman-surfing", + "skinTone": true, + "shortNames": [ + "woman-surfing" + ], + "ascii": [] + }, + { + "code": "1F6A3-200D-2642-FE0F", + "name": "man-rowing-boat", + "skinTone": true, + "shortNames": [ + "man-rowing-boat" + ], + "ascii": [] + }, + { + "code": "1F6A3-200D-2640-FE0F", + "name": "woman-rowing-boat", + "skinTone": true, + "shortNames": [ + "woman-rowing-boat" + ], + "ascii": [] + }, + { + "code": "1F3CA-200D-2642-FE0F", + "name": "man-swimming", + "skinTone": true, + "shortNames": [ + "man-swimming" + ], + "ascii": [] + }, + { + "code": "1F3CA-200D-2640-FE0F", + "name": "woman-swimming", + "skinTone": true, + "shortNames": [ + "woman-swimming" + ], + "ascii": [] + }, + { + "code": "26F9-FE0F-200D-2642-FE0F", + "name": "man-bouncing-ball", + "skinTone": true, + "shortNames": [ + "man-bouncing-ball" + ], + "ascii": [] + }, + { + "code": "26F9-FE0F-200D-2640-FE0F", + "name": "woman-bouncing-ball", + "skinTone": true, + "shortNames": [ + "woman-bouncing-ball" + ], + "ascii": [] + }, + { + "code": "1F3CB-FE0F-200D-2642-FE0F", + "name": "man-lifting-weights", + "skinTone": true, + "shortNames": [ + "man-lifting-weights" + ], + "ascii": [] + }, + { + "code": "1F3CB-FE0F-200D-2640-FE0F", + "name": "woman-lifting-weights", + "skinTone": true, + "shortNames": [ + "woman-lifting-weights" + ], + "ascii": [] + }, + { + "code": "1F6B4-200D-2642-FE0F", + "name": "man-biking", + "skinTone": true, + "shortNames": [ + "man-biking" + ], + "ascii": [] + }, + { + "code": "1F6B4-200D-2640-FE0F", + "name": "woman-biking", + "skinTone": true, + "shortNames": [ + "woman-biking" + ], + "ascii": [] + }, + { + "code": "1F6B5-200D-2642-FE0F", + "name": "man-mountain-biking", + "skinTone": true, + "shortNames": [ + "man-mountain-biking" + ], + "ascii": [] + }, + { + "code": "1F6B5-200D-2640-FE0F", + "name": "woman-mountain-biking", + "skinTone": true, + "shortNames": [ + "woman-mountain-biking" + ], + "ascii": [] + }, + { + "code": "1F3CE-FE0F", + "name": "racing_car", + "skinTone": false, + "shortNames": [ + "racing_car" + ], + "ascii": [] + }, + { + "code": "1F3CD-FE0F", + "name": "racing_motorcycle", + "skinTone": false, + "shortNames": [ + "racing_motorcycle" + ], + "ascii": [] + }, + { + "code": "1F938-200D-2642-FE0F", + "name": "man-cartwheeling", + "skinTone": true, + "shortNames": [ + "man-cartwheeling" + ], + "ascii": [] + }, + { + "code": "1F938-200D-2640-FE0F", + "name": "woman-cartwheeling", + "skinTone": true, + "shortNames": [ + "woman-cartwheeling" + ], + "ascii": [] + }, + { + "code": "1F93C-200D-2642-FE0F", + "name": "man-wrestling", + "skinTone": false, + "shortNames": [ + "man-wrestling" + ], + "ascii": [] + }, + { + "code": "1F93C-200D-2640-FE0F", + "name": "woman-wrestling", + "skinTone": false, + "shortNames": [ + "woman-wrestling" + ], + "ascii": [] + }, + { + "code": "1F93D-200D-2642-FE0F", + "name": "man-playing-water-polo", + "skinTone": true, + "shortNames": [ + "man-playing-water-polo" + ], + "ascii": [] + }, + { + "code": "1F93D-200D-2640-FE0F", + "name": "woman-playing-water-polo", + "skinTone": true, + "shortNames": [ + "woman-playing-water-polo" + ], + "ascii": [] + }, + { + "code": "1F93E-200D-2642-FE0F", + "name": "man-playing-handball", + "skinTone": true, + "shortNames": [ + "man-playing-handball" + ], + "ascii": [] + }, + { + "code": "1F93E-200D-2640-FE0F", + "name": "woman-playing-handball", + "skinTone": true, + "shortNames": [ + "woman-playing-handball" + ], + "ascii": [] + }, + { + "code": "1F939-200D-2642-FE0F", + "name": "man-juggling", + "skinTone": true, + "shortNames": [ + "man-juggling" + ], + "ascii": [] + }, + { + "code": "1F939-200D-2640-FE0F", + "name": "woman-juggling", + "skinTone": true, + "shortNames": [ + "woman-juggling" + ], + "ascii": [] + }, + { + "code": "1F46B", + "name": "couple", + "skinTone": false, + "shortNames": [ + "couple", + "man_and_woman_holding_hands" + ], + "ascii": [] + }, + { + "code": "1F46C", + "name": "two_men_holding_hands", + "skinTone": false, + "shortNames": [ + "two_men_holding_hands" + ], + "ascii": [] + }, + { + "code": "1F46D", + "name": "two_women_holding_hands", + "skinTone": false, + "shortNames": [ + "two_women_holding_hands" + ], + "ascii": [] + }, + { + "code": "1F469-200D-2764-FE0F-200D-1F48B-200D-1F468", + "name": "woman-kiss-man", + "skinTone": false, + "shortNames": [ + "woman-kiss-man" + ], + "ascii": [] + }, + { + "code": "1F468-200D-2764-FE0F-200D-1F48B-200D-1F468", + "name": "man-kiss-man", + "skinTone": false, + "shortNames": [ + "man-kiss-man" + ], + "ascii": [] + }, + { + "code": "1F469-200D-2764-FE0F-200D-1F48B-200D-1F469", + "name": "woman-kiss-woman", + "skinTone": false, + "shortNames": [ + "woman-kiss-woman" + ], + "ascii": [] + }, + { + "code": "1F469-200D-2764-FE0F-200D-1F468", + "name": "woman-heart-man", + "skinTone": false, + "shortNames": [ + "woman-heart-man" + ], + "ascii": [] + }, + { + "code": "1F468-200D-2764-FE0F-200D-1F468", + "name": "man-heart-man", + "skinTone": false, + "shortNames": [ + "man-heart-man" + ], + "ascii": [] + }, + { + "code": "1F469-200D-2764-FE0F-200D-1F469", + "name": "woman-heart-woman", + "skinTone": false, + "shortNames": [ + "woman-heart-woman" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F469-200D-1F466", + "name": "man-woman-boy", + "skinTone": false, + "shortNames": [ + "man-woman-boy", + "family" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F469-200D-1F467", + "name": "man-woman-girl", + "skinTone": false, + "shortNames": [ + "man-woman-girl" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F469-200D-1F467-200D-1F466", + "name": "man-woman-girl-boy", + "skinTone": false, + "shortNames": [ + "man-woman-girl-boy" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F469-200D-1F466-200D-1F466", + "name": "man-woman-boy-boy", + "skinTone": false, + "shortNames": [ + "man-woman-boy-boy" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F469-200D-1F467-200D-1F467", + "name": "man-woman-girl-girl", + "skinTone": false, + "shortNames": [ + "man-woman-girl-girl" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F468-200D-1F466", + "name": "man-man-boy", + "skinTone": false, + "shortNames": [ + "man-man-boy" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F468-200D-1F467", + "name": "man-man-girl", + "skinTone": false, + "shortNames": [ + "man-man-girl" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F468-200D-1F467-200D-1F466", + "name": "man-man-girl-boy", + "skinTone": false, + "shortNames": [ + "man-man-girl-boy" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F468-200D-1F466-200D-1F466", + "name": "man-man-boy-boy", + "skinTone": false, + "shortNames": [ + "man-man-boy-boy" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F468-200D-1F467-200D-1F467", + "name": "man-man-girl-girl", + "skinTone": false, + "shortNames": [ + "man-man-girl-girl" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F469-200D-1F466", + "name": "woman-woman-boy", + "skinTone": false, + "shortNames": [ + "woman-woman-boy" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F469-200D-1F467", + "name": "woman-woman-girl", + "skinTone": false, + "shortNames": [ + "woman-woman-girl" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F469-200D-1F467-200D-1F466", + "name": "woman-woman-girl-boy", + "skinTone": false, + "shortNames": [ + "woman-woman-girl-boy" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F469-200D-1F466-200D-1F466", + "name": "woman-woman-boy-boy", + "skinTone": false, + "shortNames": [ + "woman-woman-boy-boy" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F469-200D-1F467-200D-1F467", + "name": "woman-woman-girl-girl", + "skinTone": false, + "shortNames": [ + "woman-woman-girl-girl" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F466", + "name": "man-boy", + "skinTone": false, + "shortNames": [ + "man-boy" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F466-200D-1F466", + "name": "man-boy-boy", + "skinTone": false, + "shortNames": [ + "man-boy-boy" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F467", + "name": "man-girl", + "skinTone": false, + "shortNames": [ + "man-girl" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F467-200D-1F466", + "name": "man-girl-boy", + "skinTone": false, + "shortNames": [ + "man-girl-boy" + ], + "ascii": [] + }, + { + "code": "1F468-200D-1F467-200D-1F467", + "name": "man-girl-girl", + "skinTone": false, + "shortNames": [ + "man-girl-girl" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F466", + "name": "woman-boy", + "skinTone": false, + "shortNames": [ + "woman-boy" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F466-200D-1F466", + "name": "woman-boy-boy", + "skinTone": false, + "shortNames": [ + "woman-boy-boy" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F467", + "name": "woman-girl", + "skinTone": false, + "shortNames": [ + "woman-girl" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F467-200D-1F466", + "name": "woman-girl-boy", + "skinTone": false, + "shortNames": [ + "woman-girl-boy" + ], + "ascii": [] + }, + { + "code": "1F469-200D-1F467-200D-1F467", + "name": "woman-girl-girl", + "skinTone": false, + "shortNames": [ + "woman-girl-girl" + ], + "ascii": [] + }, + { + "code": "1F933", + "name": "selfie", + "skinTone": true, + "shortNames": [ + "selfie" + ], + "ascii": [] + }, + { + "code": "1F4AA", + "name": "muscle", + "skinTone": true, + "shortNames": [ + "muscle" + ], + "ascii": [] + }, + { + "code": "1F448", + "name": "point_left", + "skinTone": true, + "shortNames": [ + "point_left" + ], + "ascii": [] + }, + { + "code": "1F449", + "name": "point_right", + "skinTone": true, + "shortNames": [ + "point_right" + ], + "ascii": [] + }, + { + "code": "261D-FE0F", + "name": "point_up", + "skinTone": false, + "shortNames": [ + "point_up" + ], + "ascii": [] + }, + { + "code": "1F446", + "name": "point_up_2", + "skinTone": true, + "shortNames": [ + "point_up_2" + ], + "ascii": [] + }, + { + "code": "1F595", + "name": "middle_finger", + "skinTone": true, + "shortNames": [ + "middle_finger", + "reversed_hand_with_middle_finger_extended" + ], + "ascii": [] + }, + { + "code": "1F447", + "name": "point_down", + "skinTone": true, + "shortNames": [ + "point_down" + ], + "ascii": [] + }, + { + "code": "270C-FE0F", + "name": "v", + "skinTone": false, + "shortNames": [ + "v" + ], + "ascii": [] + }, + { + "code": "1F91E", + "name": "hand_with_index_and_middle_fingers_crossed", + "skinTone": true, + "shortNames": [ + "hand_with_index_and_middle_fingers_crossed" + ], + "ascii": [] + }, + { + "code": "1F596", + "name": "spock-hand", + "skinTone": true, + "shortNames": [ + "spock-hand" + ], + "ascii": [] + }, + { + "code": "1F918", + "name": "the_horns", + "skinTone": true, + "shortNames": [ + "the_horns", + "sign_of_the_horns" + ], + "ascii": [] + }, + { + "code": "1F919", + "name": "call_me_hand", + "skinTone": true, + "shortNames": [ + "call_me_hand" + ], + "ascii": [] + }, + { + "code": "1F590-FE0F", + "name": "raised_hand_with_fingers_splayed", + "skinTone": false, + "shortNames": [ + "raised_hand_with_fingers_splayed" + ], + "ascii": [] + }, + { + "code": "270B", + "name": "hand", + "skinTone": true, + "shortNames": [ + "hand", + "raised_hand" + ], + "ascii": [] + }, + { + "code": "1F44C", + "name": "ok_hand", + "skinTone": true, + "shortNames": [ + "ok_hand" + ], + "ascii": [] + }, + { + "code": "1F44D", + "name": "+1", + "skinTone": true, + "shortNames": [ + "+1", + "thumbsup" + ], + "ascii": [] + }, + { + "code": "1F44E", + "name": "-1", + "skinTone": true, + "shortNames": [ + "-1", + "thumbsdown" + ], + "ascii": [] + }, + { + "code": "270A", + "name": "fist", + "skinTone": true, + "shortNames": [ + "fist" + ], + "ascii": [] + }, + { + "code": "1F44A", + "name": "facepunch", + "skinTone": true, + "shortNames": [ + "facepunch", + "punch" + ], + "ascii": [] + }, + { + "code": "1F91B", + "name": "left-facing_fist", + "skinTone": true, + "shortNames": [ + "left-facing_fist" + ], + "ascii": [] + }, + { + "code": "1F91C", + "name": "right-facing_fist", + "skinTone": true, + "shortNames": [ + "right-facing_fist" + ], + "ascii": [] + }, + { + "code": "1F91A", + "name": "raised_back_of_hand", + "skinTone": true, + "shortNames": [ + "raised_back_of_hand" + ], + "ascii": [] + }, + { + "code": "1F44B", + "name": "wave", + "skinTone": true, + "shortNames": [ + "wave" + ], + "ascii": [] + }, + { + "code": "1F91F", + "name": "i_love_you_hand_sign", + "skinTone": true, + "shortNames": [ + "i_love_you_hand_sign" + ], + "ascii": [] + }, + { + "code": "270D-FE0F", + "name": "writing_hand", + "skinTone": false, + "shortNames": [ + "writing_hand" + ], + "ascii": [] + }, + { + "code": "1F44F", + "name": "clap", + "skinTone": true, + "shortNames": [ + "clap" + ], + "ascii": [] + }, + { + "code": "1F450", + "name": "open_hands", + "skinTone": true, + "shortNames": [ + "open_hands" + ], + "ascii": [] + }, + { + "code": "1F64C", + "name": "raised_hands", + "skinTone": true, + "shortNames": [ + "raised_hands" + ], + "ascii": [] + }, + { + "code": "1F932", + "name": "palms_up_together", + "skinTone": true, + "shortNames": [ + "palms_up_together" + ], + "ascii": [] + }, + { + "code": "1F64F", + "name": "pray", + "skinTone": true, + "shortNames": [ + "pray" + ], + "ascii": [] + }, + { + "code": "1F91D", + "name": "handshake", + "skinTone": false, + "shortNames": [ + "handshake" + ], + "ascii": [] + }, + { + "code": "1F485", + "name": "nail_care", + "skinTone": true, + "shortNames": [ + "nail_care" + ], + "ascii": [] + }, + { + "code": "1F442", + "name": "ear", + "skinTone": true, + "shortNames": [ + "ear" + ], + "ascii": [] + }, + { + "code": "1F443", + "name": "nose", + "skinTone": true, + "shortNames": [ + "nose" + ], + "ascii": [] + }, + { + "code": "1F463", + "name": "footprints", + "skinTone": false, + "shortNames": [ + "footprints" + ], + "ascii": [] + }, + { + "code": "1F440", + "name": "eyes", + "skinTone": false, + "shortNames": [ + "eyes" + ], + "ascii": [] + }, + { + "code": "1F441-FE0F", + "name": "eye", + "skinTone": false, + "shortNames": [ + "eye" + ], + "ascii": [] + }, + { + "code": "1F441-FE0F-200D-1F5E8-FE0F", + "name": "eye-in-speech-bubble", + "skinTone": false, + "shortNames": [ + "eye-in-speech-bubble" + ], + "ascii": [] + }, + { + "code": "1F9E0", + "name": "brain", + "skinTone": false, + "shortNames": [ + "brain" + ], + "ascii": [] + }, + { + "code": "1F445", + "name": "tongue", + "skinTone": false, + "shortNames": [ + "tongue" + ], + "ascii": [] + }, + { + "code": "1F444", + "name": "lips", + "skinTone": false, + "shortNames": [ + "lips" + ], + "ascii": [] + }, + { + "code": "1F48B", + "name": "kiss", + "skinTone": false, + "shortNames": [ + "kiss" + ], + "ascii": [] + }, + { + "code": "1F498", + "name": "cupid", + "skinTone": false, + "shortNames": [ + "cupid" + ], + "ascii": [] + }, + { + "code": "2764-FE0F", + "name": "heart", + "skinTone": false, + "shortNames": [ + "heart" + ], + "ascii": [ + "<3" + ] + }, + { + "code": "1F493", + "name": "heartbeat", + "skinTone": false, + "shortNames": [ + "heartbeat" + ], + "ascii": [] + }, + { + "code": "1F494", + "name": "broken_heart", + "skinTone": false, + "shortNames": [ + "broken_heart" + ], + "ascii": [ + "<\/3" + ] + }, + { + "code": "1F495", + "name": "two_hearts", + "skinTone": false, + "shortNames": [ + "two_hearts" + ], + "ascii": [] + }, + { + "code": "1F496", + "name": "sparkling_heart", + "skinTone": false, + "shortNames": [ + "sparkling_heart" + ], + "ascii": [] + }, + { + "code": "1F497", + "name": "heartpulse", + "skinTone": false, + "shortNames": [ + "heartpulse" + ], + "ascii": [] + }, + { + "code": "1F499", + "name": "blue_heart", + "skinTone": false, + "shortNames": [ + "blue_heart" + ], + "ascii": [] + }, + { + "code": "1F49A", + "name": "green_heart", + "skinTone": false, + "shortNames": [ + "green_heart" + ], + "ascii": [] + }, + { + "code": "1F49B", + "name": "yellow_heart", + "skinTone": false, + "shortNames": [ + "yellow_heart" + ], + "ascii": [] + }, + { + "code": "1F9E1", + "name": "orange_heart", + "skinTone": false, + "shortNames": [ + "orange_heart" + ], + "ascii": [] + }, + { + "code": "1F49C", + "name": "purple_heart", + "skinTone": false, + "shortNames": [ + "purple_heart" + ], + "ascii": [] + }, + { + "code": "1F5A4", + "name": "black_heart", + "skinTone": false, + "shortNames": [ + "black_heart" + ], + "ascii": [] + }, + { + "code": "1F49D", + "name": "gift_heart", + "skinTone": false, + "shortNames": [ + "gift_heart" + ], + "ascii": [] + }, + { + "code": "1F49E", + "name": "revolving_hearts", + "skinTone": false, + "shortNames": [ + "revolving_hearts" + ], + "ascii": [] + }, + { + "code": "1F49F", + "name": "heart_decoration", + "skinTone": false, + "shortNames": [ + "heart_decoration" + ], + "ascii": [] + }, + { + "code": "2763-FE0F", + "name": "heavy_heart_exclamation_mark_ornament", + "skinTone": false, + "shortNames": [ + "heavy_heart_exclamation_mark_ornament" + ], + "ascii": [] + }, + { + "code": "1F48C", + "name": "love_letter", + "skinTone": false, + "shortNames": [ + "love_letter" + ], + "ascii": [] + }, + { + "code": "1F4A4", + "name": "zzz", + "skinTone": false, + "shortNames": [ + "zzz" + ], + "ascii": [] + }, + { + "code": "1F4A2", + "name": "anger", + "skinTone": false, + "shortNames": [ + "anger" + ], + "ascii": [] + }, + { + "code": "1F4A3", + "name": "bomb", + "skinTone": false, + "shortNames": [ + "bomb" + ], + "ascii": [] + }, + { + "code": "1F4A5", + "name": "boom", + "skinTone": false, + "shortNames": [ + "boom", + "collision" + ], + "ascii": [] + }, + { + "code": "1F4A6", + "name": "sweat_drops", + "skinTone": false, + "shortNames": [ + "sweat_drops" + ], + "ascii": [] + }, + { + "code": "1F4A8", + "name": "dash", + "skinTone": false, + "shortNames": [ + "dash" + ], + "ascii": [] + }, + { + "code": "1F4AB", + "name": "dizzy", + "skinTone": false, + "shortNames": [ + "dizzy" + ], + "ascii": [] + }, + { + "code": "1F4AC", + "name": "speech_balloon", + "skinTone": false, + "shortNames": [ + "speech_balloon" + ], + "ascii": [] + }, + { + "code": "1F5E8-FE0F", + "name": "left_speech_bubble", + "skinTone": false, + "shortNames": [ + "left_speech_bubble" + ], + "ascii": [] + }, + { + "code": "1F5EF-FE0F", + "name": "right_anger_bubble", + "skinTone": false, + "shortNames": [ + "right_anger_bubble" + ], + "ascii": [] + }, + { + "code": "1F4AD", + "name": "thought_balloon", + "skinTone": false, + "shortNames": [ + "thought_balloon" + ], + "ascii": [] + }, + { + "code": "1F573-FE0F", + "name": "hole", + "skinTone": false, + "shortNames": [ + "hole" + ], + "ascii": [] + }, + { + "code": "1F453", + "name": "eyeglasses", + "skinTone": false, + "shortNames": [ + "eyeglasses" + ], + "ascii": [] + }, + { + "code": "1F576-FE0F", + "name": "dark_sunglasses", + "skinTone": false, + "shortNames": [ + "dark_sunglasses" + ], + "ascii": [] + }, + { + "code": "1F454", + "name": "necktie", + "skinTone": false, + "shortNames": [ + "necktie" + ], + "ascii": [] + }, + { + "code": "1F455", + "name": "shirt", + "skinTone": false, + "shortNames": [ + "shirt", + "tshirt" + ], + "ascii": [] + }, + { + "code": "1F456", + "name": "jeans", + "skinTone": false, + "shortNames": [ + "jeans" + ], + "ascii": [] + }, + { + "code": "1F9E3", + "name": "scarf", + "skinTone": false, + "shortNames": [ + "scarf" + ], + "ascii": [] + }, + { + "code": "1F9E4", + "name": "gloves", + "skinTone": false, + "shortNames": [ + "gloves" + ], + "ascii": [] + }, + { + "code": "1F9E5", + "name": "coat", + "skinTone": false, + "shortNames": [ + "coat" + ], + "ascii": [] + }, + { + "code": "1F9E6", + "name": "socks", + "skinTone": false, + "shortNames": [ + "socks" + ], + "ascii": [] + }, + { + "code": "1F457", + "name": "dress", + "skinTone": false, + "shortNames": [ + "dress" + ], + "ascii": [] + }, + { + "code": "1F458", + "name": "kimono", + "skinTone": false, + "shortNames": [ + "kimono" + ], + "ascii": [] + }, + { + "code": "1F459", + "name": "bikini", + "skinTone": false, + "shortNames": [ + "bikini" + ], + "ascii": [] + }, + { + "code": "1F45A", + "name": "womans_clothes", + "skinTone": false, + "shortNames": [ + "womans_clothes" + ], + "ascii": [] + }, + { + "code": "1F45B", + "name": "purse", + "skinTone": false, + "shortNames": [ + "purse" + ], + "ascii": [] + }, + { + "code": "1F45C", + "name": "handbag", + "skinTone": false, + "shortNames": [ + "handbag" + ], + "ascii": [] + }, + { + "code": "1F45D", + "name": "pouch", + "skinTone": false, + "shortNames": [ + "pouch" + ], + "ascii": [] + }, + { + "code": "1F6CD-FE0F", + "name": "shopping_bags", + "skinTone": false, + "shortNames": [ + "shopping_bags" + ], + "ascii": [] + }, + { + "code": "1F392", + "name": "school_satchel", + "skinTone": false, + "shortNames": [ + "school_satchel" + ], + "ascii": [] + }, + { + "code": "1F45E", + "name": "mans_shoe", + "skinTone": false, + "shortNames": [ + "mans_shoe", + "shoe" + ], + "ascii": [] + }, + { + "code": "1F45F", + "name": "athletic_shoe", + "skinTone": false, + "shortNames": [ + "athletic_shoe" + ], + "ascii": [] + }, + { + "code": "1F460", + "name": "high_heel", + "skinTone": false, + "shortNames": [ + "high_heel" + ], + "ascii": [] + }, + { + "code": "1F461", + "name": "sandal", + "skinTone": false, + "shortNames": [ + "sandal" + ], + "ascii": [] + }, + { + "code": "1F462", + "name": "boot", + "skinTone": false, + "shortNames": [ + "boot" + ], + "ascii": [] + }, + { + "code": "1F451", + "name": "crown", + "skinTone": false, + "shortNames": [ + "crown" + ], + "ascii": [] + }, + { + "code": "1F452", + "name": "womans_hat", + "skinTone": false, + "shortNames": [ + "womans_hat" + ], + "ascii": [] + }, + { + "code": "1F3A9", + "name": "tophat", + "skinTone": false, + "shortNames": [ + "tophat" + ], + "ascii": [] + }, + { + "code": "1F393", + "name": "mortar_board", + "skinTone": false, + "shortNames": [ + "mortar_board" + ], + "ascii": [] + }, + { + "code": "1F9E2", + "name": "billed_cap", + "skinTone": false, + "shortNames": [ + "billed_cap" + ], + "ascii": [] + }, + { + "code": "26D1-FE0F", + "name": "helmet_with_white_cross", + "skinTone": false, + "shortNames": [ + "helmet_with_white_cross" + ], + "ascii": [] + }, + { + "code": "1F4FF", + "name": "prayer_beads", + "skinTone": false, + "shortNames": [ + "prayer_beads" + ], + "ascii": [] + }, + { + "code": "1F484", + "name": "lipstick", + "skinTone": false, + "shortNames": [ + "lipstick" + ], + "ascii": [] + }, + { + "code": "1F48D", + "name": "ring", + "skinTone": false, + "shortNames": [ + "ring" + ], + "ascii": [] + }, + { + "code": "1F48E", + "name": "gem", + "skinTone": false, + "shortNames": [ + "gem" + ], + "ascii": [] + } + ], + "animals_nature": [ + { + "code": "1F435", + "name": "monkey_face", + "skinTone": false, + "shortNames": [ + "monkey_face" + ], + "ascii": [ + ":o)" + ] + }, + { + "code": "1F412", + "name": "monkey", + "skinTone": false, + "shortNames": [ + "monkey" + ], + "ascii": [] + }, + { + "code": "1F98D", + "name": "gorilla", + "skinTone": false, + "shortNames": [ + "gorilla" + ], + "ascii": [] + }, + { + "code": "1F436", + "name": "dog", + "skinTone": false, + "shortNames": [ + "dog" + ], + "ascii": [] + }, + { + "code": "1F415", + "name": "dog2", + "skinTone": false, + "shortNames": [ + "dog2" + ], + "ascii": [] + }, + { + "code": "1F429", + "name": "poodle", + "skinTone": false, + "shortNames": [ + "poodle" + ], + "ascii": [] + }, + { + "code": "1F43A", + "name": "wolf", + "skinTone": false, + "shortNames": [ + "wolf" + ], + "ascii": [] + }, + { + "code": "1F98A", + "name": "fox_face", + "skinTone": false, + "shortNames": [ + "fox_face" + ], + "ascii": [] + }, + { + "code": "1F431", + "name": "cat", + "skinTone": false, + "shortNames": [ + "cat" + ], + "ascii": [] + }, + { + "code": "1F408", + "name": "cat2", + "skinTone": false, + "shortNames": [ + "cat2" + ], + "ascii": [] + }, + { + "code": "1F981", + "name": "lion_face", + "skinTone": false, + "shortNames": [ + "lion_face" + ], + "ascii": [] + }, + { + "code": "1F42F", + "name": "tiger", + "skinTone": false, + "shortNames": [ + "tiger" + ], + "ascii": [] + }, + { + "code": "1F405", + "name": "tiger2", + "skinTone": false, + "shortNames": [ + "tiger2" + ], + "ascii": [] + }, + { + "code": "1F406", + "name": "leopard", + "skinTone": false, + "shortNames": [ + "leopard" + ], + "ascii": [] + }, + { + "code": "1F434", + "name": "horse", + "skinTone": false, + "shortNames": [ + "horse" + ], + "ascii": [] + }, + { + "code": "1F40E", + "name": "racehorse", + "skinTone": false, + "shortNames": [ + "racehorse" + ], + "ascii": [] + }, + { + "code": "1F984", + "name": "unicorn_face", + "skinTone": false, + "shortNames": [ + "unicorn_face" + ], + "ascii": [] + }, + { + "code": "1F993", + "name": "zebra_face", + "skinTone": false, + "shortNames": [ + "zebra_face" + ], + "ascii": [] + }, + { + "code": "1F98C", + "name": "deer", + "skinTone": false, + "shortNames": [ + "deer" + ], + "ascii": [] + }, + { + "code": "1F42E", + "name": "cow", + "skinTone": false, + "shortNames": [ + "cow" + ], + "ascii": [] + }, + { + "code": "1F402", + "name": "ox", + "skinTone": false, + "shortNames": [ + "ox" + ], + "ascii": [] + }, + { + "code": "1F403", + "name": "water_buffalo", + "skinTone": false, + "shortNames": [ + "water_buffalo" + ], + "ascii": [] + }, + { + "code": "1F404", + "name": "cow2", + "skinTone": false, + "shortNames": [ + "cow2" + ], + "ascii": [] + }, + { + "code": "1F437", + "name": "pig", + "skinTone": false, + "shortNames": [ + "pig" + ], + "ascii": [] + }, + { + "code": "1F416", + "name": "pig2", + "skinTone": false, + "shortNames": [ + "pig2" + ], + "ascii": [] + }, + { + "code": "1F417", + "name": "boar", + "skinTone": false, + "shortNames": [ + "boar" + ], + "ascii": [] + }, + { + "code": "1F43D", + "name": "pig_nose", + "skinTone": false, + "shortNames": [ + "pig_nose" + ], + "ascii": [] + }, + { + "code": "1F40F", + "name": "ram", + "skinTone": false, + "shortNames": [ + "ram" + ], + "ascii": [] + }, + { + "code": "1F411", + "name": "sheep", + "skinTone": false, + "shortNames": [ + "sheep" + ], + "ascii": [] + }, + { + "code": "1F410", + "name": "goat", + "skinTone": false, + "shortNames": [ + "goat" + ], + "ascii": [] + }, + { + "code": "1F42A", + "name": "dromedary_camel", + "skinTone": false, + "shortNames": [ + "dromedary_camel" + ], + "ascii": [] + }, + { + "code": "1F42B", + "name": "camel", + "skinTone": false, + "shortNames": [ + "camel" + ], + "ascii": [] + }, + { + "code": "1F992", + "name": "giraffe_face", + "skinTone": false, + "shortNames": [ + "giraffe_face" + ], + "ascii": [] + }, + { + "code": "1F418", + "name": "elephant", + "skinTone": false, + "shortNames": [ + "elephant" + ], + "ascii": [] + }, + { + "code": "1F98F", + "name": "rhinoceros", + "skinTone": false, + "shortNames": [ + "rhinoceros" + ], + "ascii": [] + }, + { + "code": "1F42D", + "name": "mouse", + "skinTone": false, + "shortNames": [ + "mouse" + ], + "ascii": [] + }, + { + "code": "1F401", + "name": "mouse2", + "skinTone": false, + "shortNames": [ + "mouse2" + ], + "ascii": [] + }, + { + "code": "1F400", + "name": "rat", + "skinTone": false, + "shortNames": [ + "rat" + ], + "ascii": [] + }, + { + "code": "1F439", + "name": "hamster", + "skinTone": false, + "shortNames": [ + "hamster" + ], + "ascii": [] + }, + { + "code": "1F430", + "name": "rabbit", + "skinTone": false, + "shortNames": [ + "rabbit" + ], + "ascii": [] + }, + { + "code": "1F407", + "name": "rabbit2", + "skinTone": false, + "shortNames": [ + "rabbit2" + ], + "ascii": [] + }, + { + "code": "1F43F-FE0F", + "name": "chipmunk", + "skinTone": false, + "shortNames": [ + "chipmunk" + ], + "ascii": [] + }, + { + "code": "1F994", + "name": "hedgehog", + "skinTone": false, + "shortNames": [ + "hedgehog" + ], + "ascii": [] + }, + { + "code": "1F987", + "name": "bat", + "skinTone": false, + "shortNames": [ + "bat" + ], + "ascii": [] + }, + { + "code": "1F43B", + "name": "bear", + "skinTone": false, + "shortNames": [ + "bear" + ], + "ascii": [] + }, + { + "code": "1F428", + "name": "koala", + "skinTone": false, + "shortNames": [ + "koala" + ], + "ascii": [] + }, + { + "code": "1F43C", + "name": "panda_face", + "skinTone": false, + "shortNames": [ + "panda_face" + ], + "ascii": [] + }, + { + "code": "1F43E", + "name": "feet", + "skinTone": false, + "shortNames": [ + "feet", + "paw_prints" + ], + "ascii": [] + }, + { + "code": "1F983", + "name": "turkey", + "skinTone": false, + "shortNames": [ + "turkey" + ], + "ascii": [] + }, + { + "code": "1F414", + "name": "chicken", + "skinTone": false, + "shortNames": [ + "chicken" + ], + "ascii": [] + }, + { + "code": "1F413", + "name": "rooster", + "skinTone": false, + "shortNames": [ + "rooster" + ], + "ascii": [] + }, + { + "code": "1F423", + "name": "hatching_chick", + "skinTone": false, + "shortNames": [ + "hatching_chick" + ], + "ascii": [] + }, + { + "code": "1F424", + "name": "baby_chick", + "skinTone": false, + "shortNames": [ + "baby_chick" + ], + "ascii": [] + }, + { + "code": "1F425", + "name": "hatched_chick", + "skinTone": false, + "shortNames": [ + "hatched_chick" + ], + "ascii": [] + }, + { + "code": "1F426", + "name": "bird", + "skinTone": false, + "shortNames": [ + "bird" + ], + "ascii": [] + }, + { + "code": "1F427", + "name": "penguin", + "skinTone": false, + "shortNames": [ + "penguin" + ], + "ascii": [] + }, + { + "code": "1F54A-FE0F", + "name": "dove_of_peace", + "skinTone": false, + "shortNames": [ + "dove_of_peace" + ], + "ascii": [] + }, + { + "code": "1F985", + "name": "eagle", + "skinTone": false, + "shortNames": [ + "eagle" + ], + "ascii": [] + }, + { + "code": "1F986", + "name": "duck", + "skinTone": false, + "shortNames": [ + "duck" + ], + "ascii": [] + }, + { + "code": "1F989", + "name": "owl", + "skinTone": false, + "shortNames": [ + "owl" + ], + "ascii": [] + }, + { + "code": "1F438", + "name": "frog", + "skinTone": false, + "shortNames": [ + "frog" + ], + "ascii": [] + }, + { + "code": "1F40A", + "name": "crocodile", + "skinTone": false, + "shortNames": [ + "crocodile" + ], + "ascii": [] + }, + { + "code": "1F422", + "name": "turtle", + "skinTone": false, + "shortNames": [ + "turtle" + ], + "ascii": [] + }, + { + "code": "1F98E", + "name": "lizard", + "skinTone": false, + "shortNames": [ + "lizard" + ], + "ascii": [] + }, + { + "code": "1F40D", + "name": "snake", + "skinTone": false, + "shortNames": [ + "snake" + ], + "ascii": [] + }, + { + "code": "1F432", + "name": "dragon_face", + "skinTone": false, + "shortNames": [ + "dragon_face" + ], + "ascii": [] + }, + { + "code": "1F409", + "name": "dragon", + "skinTone": false, + "shortNames": [ + "dragon" + ], + "ascii": [] + }, + { + "code": "1F995", + "name": "sauropod", + "skinTone": false, + "shortNames": [ + "sauropod" + ], + "ascii": [] + }, + { + "code": "1F996", + "name": "t-rex", + "skinTone": false, + "shortNames": [ + "t-rex" + ], + "ascii": [] + }, + { + "code": "1F433", + "name": "whale", + "skinTone": false, + "shortNames": [ + "whale" + ], + "ascii": [] + }, + { + "code": "1F40B", + "name": "whale2", + "skinTone": false, + "shortNames": [ + "whale2" + ], + "ascii": [] + }, + { + "code": "1F42C", + "name": "dolphin", + "skinTone": false, + "shortNames": [ + "dolphin", + "flipper" + ], + "ascii": [] + }, + { + "code": "1F41F", + "name": "fish", + "skinTone": false, + "shortNames": [ + "fish" + ], + "ascii": [] + }, + { + "code": "1F420", + "name": "tropical_fish", + "skinTone": false, + "shortNames": [ + "tropical_fish" + ], + "ascii": [] + }, + { + "code": "1F421", + "name": "blowfish", + "skinTone": false, + "shortNames": [ + "blowfish" + ], + "ascii": [] + }, + { + "code": "1F988", + "name": "shark", + "skinTone": false, + "shortNames": [ + "shark" + ], + "ascii": [] + }, + { + "code": "1F419", + "name": "octopus", + "skinTone": false, + "shortNames": [ + "octopus" + ], + "ascii": [] + }, + { + "code": "1F41A", + "name": "shell", + "skinTone": false, + "shortNames": [ + "shell" + ], + "ascii": [] + }, + { + "code": "1F980", + "name": "crab", + "skinTone": false, + "shortNames": [ + "crab" + ], + "ascii": [] + }, + { + "code": "1F990", + "name": "shrimp", + "skinTone": false, + "shortNames": [ + "shrimp" + ], + "ascii": [] + }, + { + "code": "1F991", + "name": "squid", + "skinTone": false, + "shortNames": [ + "squid" + ], + "ascii": [] + }, + { + "code": "1F40C", + "name": "snail", + "skinTone": false, + "shortNames": [ + "snail" + ], + "ascii": [] + }, + { + "code": "1F98B", + "name": "butterfly", + "skinTone": false, + "shortNames": [ + "butterfly" + ], + "ascii": [] + }, + { + "code": "1F41B", + "name": "bug", + "skinTone": false, + "shortNames": [ + "bug" + ], + "ascii": [] + }, + { + "code": "1F41C", + "name": "ant", + "skinTone": false, + "shortNames": [ + "ant" + ], + "ascii": [] + }, + { + "code": "1F41D", + "name": "bee", + "skinTone": false, + "shortNames": [ + "bee", + "honeybee" + ], + "ascii": [] + }, + { + "code": "1F41E", + "name": "beetle", + "skinTone": false, + "shortNames": [ + "beetle" + ], + "ascii": [] + }, + { + "code": "1F997", + "name": "cricket", + "skinTone": false, + "shortNames": [ + "cricket" + ], + "ascii": [] + }, + { + "code": "1F577-FE0F", + "name": "spider", + "skinTone": false, + "shortNames": [ + "spider" + ], + "ascii": [] + }, + { + "code": "1F578-FE0F", + "name": "spider_web", + "skinTone": false, + "shortNames": [ + "spider_web" + ], + "ascii": [] + }, + { + "code": "1F982", + "name": "scorpion", + "skinTone": false, + "shortNames": [ + "scorpion" + ], + "ascii": [] + }, + { + "code": "1F490", + "name": "bouquet", + "skinTone": false, + "shortNames": [ + "bouquet" + ], + "ascii": [] + }, + { + "code": "1F338", + "name": "cherry_blossom", + "skinTone": false, + "shortNames": [ + "cherry_blossom" + ], + "ascii": [] + }, + { + "code": "1F4AE", + "name": "white_flower", + "skinTone": false, + "shortNames": [ + "white_flower" + ], + "ascii": [] + }, + { + "code": "1F3F5-FE0F", + "name": "rosette", + "skinTone": false, + "shortNames": [ + "rosette" + ], + "ascii": [] + }, + { + "code": "1F339", + "name": "rose", + "skinTone": false, + "shortNames": [ + "rose" + ], + "ascii": [] + }, + { + "code": "1F940", + "name": "wilted_flower", + "skinTone": false, + "shortNames": [ + "wilted_flower" + ], + "ascii": [] + }, + { + "code": "1F33A", + "name": "hibiscus", + "skinTone": false, + "shortNames": [ + "hibiscus" + ], + "ascii": [] + }, + { + "code": "1F33B", + "name": "sunflower", + "skinTone": false, + "shortNames": [ + "sunflower" + ], + "ascii": [] + }, + { + "code": "1F33C", + "name": "blossom", + "skinTone": false, + "shortNames": [ + "blossom" + ], + "ascii": [] + }, + { + "code": "1F337", + "name": "tulip", + "skinTone": false, + "shortNames": [ + "tulip" + ], + "ascii": [] + }, + { + "code": "1F331", + "name": "seedling", + "skinTone": false, + "shortNames": [ + "seedling" + ], + "ascii": [] + }, + { + "code": "1F332", + "name": "evergreen_tree", + "skinTone": false, + "shortNames": [ + "evergreen_tree" + ], + "ascii": [] + }, + { + "code": "1F333", + "name": "deciduous_tree", + "skinTone": false, + "shortNames": [ + "deciduous_tree" + ], + "ascii": [] + }, + { + "code": "1F334", + "name": "palm_tree", + "skinTone": false, + "shortNames": [ + "palm_tree" + ], + "ascii": [] + }, + { + "code": "1F335", + "name": "cactus", + "skinTone": false, + "shortNames": [ + "cactus" + ], + "ascii": [] + }, + { + "code": "1F33E", + "name": "ear_of_rice", + "skinTone": false, + "shortNames": [ + "ear_of_rice" + ], + "ascii": [] + }, + { + "code": "1F33F", + "name": "herb", + "skinTone": false, + "shortNames": [ + "herb" + ], + "ascii": [] + }, + { + "code": "2618-FE0F", + "name": "shamrock", + "skinTone": false, + "shortNames": [ + "shamrock" + ], + "ascii": [] + }, + { + "code": "1F340", + "name": "four_leaf_clover", + "skinTone": false, + "shortNames": [ + "four_leaf_clover" + ], + "ascii": [] + }, + { + "code": "1F341", + "name": "maple_leaf", + "skinTone": false, + "shortNames": [ + "maple_leaf" + ], + "ascii": [] + }, + { + "code": "1F342", + "name": "fallen_leaf", + "skinTone": false, + "shortNames": [ + "fallen_leaf" + ], + "ascii": [] + }, + { + "code": "1F343", + "name": "leaves", + "skinTone": false, + "shortNames": [ + "leaves" + ], + "ascii": [] + } + ], + "food_drink": [ + { + "code": "1F347", + "name": "grapes", + "skinTone": false, + "shortNames": [ + "grapes" + ], + "ascii": [] + }, + { + "code": "1F348", + "name": "melon", + "skinTone": false, + "shortNames": [ + "melon" + ], + "ascii": [] + }, + { + "code": "1F349", + "name": "watermelon", + "skinTone": false, + "shortNames": [ + "watermelon" + ], + "ascii": [] + }, + { + "code": "1F34A", + "name": "tangerine", + "skinTone": false, + "shortNames": [ + "tangerine" + ], + "ascii": [] + }, + { + "code": "1F34B", + "name": "lemon", + "skinTone": false, + "shortNames": [ + "lemon" + ], + "ascii": [] + }, + { + "code": "1F34C", + "name": "banana", + "skinTone": false, + "shortNames": [ + "banana" + ], + "ascii": [] + }, + { + "code": "1F34D", + "name": "pineapple", + "skinTone": false, + "shortNames": [ + "pineapple" + ], + "ascii": [] + }, + { + "code": "1F34E", + "name": "apple", + "skinTone": false, + "shortNames": [ + "apple" + ], + "ascii": [] + }, + { + "code": "1F34F", + "name": "green_apple", + "skinTone": false, + "shortNames": [ + "green_apple" + ], + "ascii": [] + }, + { + "code": "1F350", + "name": "pear", + "skinTone": false, + "shortNames": [ + "pear" + ], + "ascii": [] + }, + { + "code": "1F351", + "name": "peach", + "skinTone": false, + "shortNames": [ + "peach" + ], + "ascii": [] + }, + { + "code": "1F352", + "name": "cherries", + "skinTone": false, + "shortNames": [ + "cherries" + ], + "ascii": [] + }, + { + "code": "1F353", + "name": "strawberry", + "skinTone": false, + "shortNames": [ + "strawberry" + ], + "ascii": [] + }, + { + "code": "1F95D", + "name": "kiwifruit", + "skinTone": false, + "shortNames": [ + "kiwifruit" + ], + "ascii": [] + }, + { + "code": "1F345", + "name": "tomato", + "skinTone": false, + "shortNames": [ + "tomato" + ], + "ascii": [] + }, + { + "code": "1F965", + "name": "coconut", + "skinTone": false, + "shortNames": [ + "coconut" + ], + "ascii": [] + }, + { + "code": "1F951", + "name": "avocado", + "skinTone": false, + "shortNames": [ + "avocado" + ], + "ascii": [] + }, + { + "code": "1F346", + "name": "eggplant", + "skinTone": false, + "shortNames": [ + "eggplant" + ], + "ascii": [] + }, + { + "code": "1F954", + "name": "potato", + "skinTone": false, + "shortNames": [ + "potato" + ], + "ascii": [] + }, + { + "code": "1F955", + "name": "carrot", + "skinTone": false, + "shortNames": [ + "carrot" + ], + "ascii": [] + }, + { + "code": "1F33D", + "name": "corn", + "skinTone": false, + "shortNames": [ + "corn" + ], + "ascii": [] + }, + { + "code": "1F336-FE0F", + "name": "hot_pepper", + "skinTone": false, + "shortNames": [ + "hot_pepper" + ], + "ascii": [] + }, + { + "code": "1F952", + "name": "cucumber", + "skinTone": false, + "shortNames": [ + "cucumber" + ], + "ascii": [] + }, + { + "code": "1F966", + "name": "broccoli", + "skinTone": false, + "shortNames": [ + "broccoli" + ], + "ascii": [] + }, + { + "code": "1F344", + "name": "mushroom", + "skinTone": false, + "shortNames": [ + "mushroom" + ], + "ascii": [] + }, + { + "code": "1F95C", + "name": "peanuts", + "skinTone": false, + "shortNames": [ + "peanuts" + ], + "ascii": [] + }, + { + "code": "1F330", + "name": "chestnut", + "skinTone": false, + "shortNames": [ + "chestnut" + ], + "ascii": [] + }, + { + "code": "1F35E", + "name": "bread", + "skinTone": false, + "shortNames": [ + "bread" + ], + "ascii": [] + }, + { + "code": "1F950", + "name": "croissant", + "skinTone": false, + "shortNames": [ + "croissant" + ], + "ascii": [] + }, + { + "code": "1F956", + "name": "baguette_bread", + "skinTone": false, + "shortNames": [ + "baguette_bread" + ], + "ascii": [] + }, + { + "code": "1F968", + "name": "pretzel", + "skinTone": false, + "shortNames": [ + "pretzel" + ], + "ascii": [] + }, + { + "code": "1F95E", + "name": "pancakes", + "skinTone": false, + "shortNames": [ + "pancakes" + ], + "ascii": [] + }, + { + "code": "1F9C0", + "name": "cheese_wedge", + "skinTone": false, + "shortNames": [ + "cheese_wedge" + ], + "ascii": [] + }, + { + "code": "1F356", + "name": "meat_on_bone", + "skinTone": false, + "shortNames": [ + "meat_on_bone" + ], + "ascii": [] + }, + { + "code": "1F357", + "name": "poultry_leg", + "skinTone": false, + "shortNames": [ + "poultry_leg" + ], + "ascii": [] + }, + { + "code": "1F969", + "name": "cut_of_meat", + "skinTone": false, + "shortNames": [ + "cut_of_meat" + ], + "ascii": [] + }, + { + "code": "1F953", + "name": "bacon", + "skinTone": false, + "shortNames": [ + "bacon" + ], + "ascii": [] + }, + { + "code": "1F354", + "name": "hamburger", + "skinTone": false, + "shortNames": [ + "hamburger" + ], + "ascii": [] + }, + { + "code": "1F35F", + "name": "fries", + "skinTone": false, + "shortNames": [ + "fries" + ], + "ascii": [] + }, + { + "code": "1F355", + "name": "pizza", + "skinTone": false, + "shortNames": [ + "pizza" + ], + "ascii": [] + }, + { + "code": "1F32D", + "name": "hotdog", + "skinTone": false, + "shortNames": [ + "hotdog" + ], + "ascii": [] + }, + { + "code": "1F96A", + "name": "sandwich", + "skinTone": false, + "shortNames": [ + "sandwich" + ], + "ascii": [] + }, + { + "code": "1F32E", + "name": "taco", + "skinTone": false, + "shortNames": [ + "taco" + ], + "ascii": [] + }, + { + "code": "1F32F", + "name": "burrito", + "skinTone": false, + "shortNames": [ + "burrito" + ], + "ascii": [] + }, + { + "code": "1F959", + "name": "stuffed_flatbread", + "skinTone": false, + "shortNames": [ + "stuffed_flatbread" + ], + "ascii": [] + }, + { + "code": "1F95A", + "name": "egg", + "skinTone": false, + "shortNames": [ + "egg" + ], + "ascii": [] + }, + { + "code": "1F373", + "name": "fried_egg", + "skinTone": false, + "shortNames": [ + "fried_egg", + "cooking" + ], + "ascii": [] + }, + { + "code": "1F958", + "name": "shallow_pan_of_food", + "skinTone": false, + "shortNames": [ + "shallow_pan_of_food" + ], + "ascii": [] + }, + { + "code": "1F372", + "name": "stew", + "skinTone": false, + "shortNames": [ + "stew" + ], + "ascii": [] + }, + { + "code": "1F963", + "name": "bowl_with_spoon", + "skinTone": false, + "shortNames": [ + "bowl_with_spoon" + ], + "ascii": [] + }, + { + "code": "1F957", + "name": "green_salad", + "skinTone": false, + "shortNames": [ + "green_salad" + ], + "ascii": [] + }, + { + "code": "1F37F", + "name": "popcorn", + "skinTone": false, + "shortNames": [ + "popcorn" + ], + "ascii": [] + }, + { + "code": "1F96B", + "name": "canned_food", + "skinTone": false, + "shortNames": [ + "canned_food" + ], + "ascii": [] + }, + { + "code": "1F371", + "name": "bento", + "skinTone": false, + "shortNames": [ + "bento" + ], + "ascii": [] + }, + { + "code": "1F358", + "name": "rice_cracker", + "skinTone": false, + "shortNames": [ + "rice_cracker" + ], + "ascii": [] + }, + { + "code": "1F359", + "name": "rice_ball", + "skinTone": false, + "shortNames": [ + "rice_ball" + ], + "ascii": [] + }, + { + "code": "1F35A", + "name": "rice", + "skinTone": false, + "shortNames": [ + "rice" + ], + "ascii": [] + }, + { + "code": "1F35B", + "name": "curry", + "skinTone": false, + "shortNames": [ + "curry" + ], + "ascii": [] + }, + { + "code": "1F35C", + "name": "ramen", + "skinTone": false, + "shortNames": [ + "ramen" + ], + "ascii": [] + }, + { + "code": "1F35D", + "name": "spaghetti", + "skinTone": false, + "shortNames": [ + "spaghetti" + ], + "ascii": [] + }, + { + "code": "1F360", + "name": "sweet_potato", + "skinTone": false, + "shortNames": [ + "sweet_potato" + ], + "ascii": [] + }, + { + "code": "1F362", + "name": "oden", + "skinTone": false, + "shortNames": [ + "oden" + ], + "ascii": [] + }, + { + "code": "1F363", + "name": "sushi", + "skinTone": false, + "shortNames": [ + "sushi" + ], + "ascii": [] + }, + { + "code": "1F364", + "name": "fried_shrimp", + "skinTone": false, + "shortNames": [ + "fried_shrimp" + ], + "ascii": [] + }, + { + "code": "1F365", + "name": "fish_cake", + "skinTone": false, + "shortNames": [ + "fish_cake" + ], + "ascii": [] + }, + { + "code": "1F361", + "name": "dango", + "skinTone": false, + "shortNames": [ + "dango" + ], + "ascii": [] + }, + { + "code": "1F95F", + "name": "dumpling", + "skinTone": false, + "shortNames": [ + "dumpling" + ], + "ascii": [] + }, + { + "code": "1F960", + "name": "fortune_cookie", + "skinTone": false, + "shortNames": [ + "fortune_cookie" + ], + "ascii": [] + }, + { + "code": "1F961", + "name": "takeout_box", + "skinTone": false, + "shortNames": [ + "takeout_box" + ], + "ascii": [] + }, + { + "code": "1F366", + "name": "icecream", + "skinTone": false, + "shortNames": [ + "icecream" + ], + "ascii": [] + }, + { + "code": "1F367", + "name": "shaved_ice", + "skinTone": false, + "shortNames": [ + "shaved_ice" + ], + "ascii": [] + }, + { + "code": "1F368", + "name": "ice_cream", + "skinTone": false, + "shortNames": [ + "ice_cream" + ], + "ascii": [] + }, + { + "code": "1F369", + "name": "doughnut", + "skinTone": false, + "shortNames": [ + "doughnut" + ], + "ascii": [] + }, + { + "code": "1F36A", + "name": "cookie", + "skinTone": false, + "shortNames": [ + "cookie" + ], + "ascii": [] + }, + { + "code": "1F382", + "name": "birthday", + "skinTone": false, + "shortNames": [ + "birthday" + ], + "ascii": [] + }, + { + "code": "1F370", + "name": "cake", + "skinTone": false, + "shortNames": [ + "cake" + ], + "ascii": [] + }, + { + "code": "1F967", + "name": "pie", + "skinTone": false, + "shortNames": [ + "pie" + ], + "ascii": [] + }, + { + "code": "1F36B", + "name": "chocolate_bar", + "skinTone": false, + "shortNames": [ + "chocolate_bar" + ], + "ascii": [] + }, + { + "code": "1F36C", + "name": "candy", + "skinTone": false, + "shortNames": [ + "candy" + ], + "ascii": [] + }, + { + "code": "1F36D", + "name": "lollipop", + "skinTone": false, + "shortNames": [ + "lollipop" + ], + "ascii": [] + }, + { + "code": "1F36E", + "name": "custard", + "skinTone": false, + "shortNames": [ + "custard" + ], + "ascii": [] + }, + { + "code": "1F36F", + "name": "honey_pot", + "skinTone": false, + "shortNames": [ + "honey_pot" + ], + "ascii": [] + }, + { + "code": "1F37C", + "name": "baby_bottle", + "skinTone": false, + "shortNames": [ + "baby_bottle" + ], + "ascii": [] + }, + { + "code": "1F95B", + "name": "glass_of_milk", + "skinTone": false, + "shortNames": [ + "glass_of_milk" + ], + "ascii": [] + }, + { + "code": "2615", + "name": "coffee", + "skinTone": false, + "shortNames": [ + "coffee" + ], + "ascii": [] + }, + { + "code": "1F375", + "name": "tea", + "skinTone": false, + "shortNames": [ + "tea" + ], + "ascii": [] + }, + { + "code": "1F376", + "name": "sake", + "skinTone": false, + "shortNames": [ + "sake" + ], + "ascii": [] + }, + { + "code": "1F37E", + "name": "champagne", + "skinTone": false, + "shortNames": [ + "champagne" + ], + "ascii": [] + }, + { + "code": "1F377", + "name": "wine_glass", + "skinTone": false, + "shortNames": [ + "wine_glass" + ], + "ascii": [] + }, + { + "code": "1F378", + "name": "cocktail", + "skinTone": false, + "shortNames": [ + "cocktail" + ], + "ascii": [] + }, + { + "code": "1F379", + "name": "tropical_drink", + "skinTone": false, + "shortNames": [ + "tropical_drink" + ], + "ascii": [] + }, + { + "code": "1F37A", + "name": "beer", + "skinTone": false, + "shortNames": [ + "beer" + ], + "ascii": [] + }, + { + "code": "1F37B", + "name": "beers", + "skinTone": false, + "shortNames": [ + "beers" + ], + "ascii": [] + }, + { + "code": "1F942", + "name": "clinking_glasses", + "skinTone": false, + "shortNames": [ + "clinking_glasses" + ], + "ascii": [] + }, + { + "code": "1F943", + "name": "tumbler_glass", + "skinTone": false, + "shortNames": [ + "tumbler_glass" + ], + "ascii": [] + }, + { + "code": "1F964", + "name": "cup_with_straw", + "skinTone": false, + "shortNames": [ + "cup_with_straw" + ], + "ascii": [] + }, + { + "code": "1F962", + "name": "chopsticks", + "skinTone": false, + "shortNames": [ + "chopsticks" + ], + "ascii": [] + }, + { + "code": "1F37D-FE0F", + "name": "knife_fork_plate", + "skinTone": false, + "shortNames": [ + "knife_fork_plate" + ], + "ascii": [] + }, + { + "code": "1F374", + "name": "fork_and_knife", + "skinTone": false, + "shortNames": [ + "fork_and_knife" + ], + "ascii": [] + }, + { + "code": "1F944", + "name": "spoon", + "skinTone": false, + "shortNames": [ + "spoon" + ], + "ascii": [] + }, + { + "code": "1F52A", + "name": "hocho", + "skinTone": false, + "shortNames": [ + "hocho", + "knife" + ], + "ascii": [] + }, + { + "code": "1F3FA", + "name": "amphora", + "skinTone": false, + "shortNames": [ + "amphora" + ], + "ascii": [] + } + ], + "activities": [ + { + "code": "1F383", + "name": "jack_o_lantern", + "skinTone": false, + "shortNames": [ + "jack_o_lantern" + ], + "ascii": [] + }, + { + "code": "1F384", + "name": "christmas_tree", + "skinTone": false, + "shortNames": [ + "christmas_tree" + ], + "ascii": [] + }, + { + "code": "1F386", + "name": "fireworks", + "skinTone": false, + "shortNames": [ + "fireworks" + ], + "ascii": [] + }, + { + "code": "1F387", + "name": "sparkler", + "skinTone": false, + "shortNames": [ + "sparkler" + ], + "ascii": [] + }, + { + "code": "2728", + "name": "sparkles", + "skinTone": false, + "shortNames": [ + "sparkles" + ], + "ascii": [] + }, + { + "code": "1F388", + "name": "balloon", + "skinTone": false, + "shortNames": [ + "balloon" + ], + "ascii": [] + }, + { + "code": "1F389", + "name": "tada", + "skinTone": false, + "shortNames": [ + "tada" + ], + "ascii": [] + }, + { + "code": "1F38A", + "name": "confetti_ball", + "skinTone": false, + "shortNames": [ + "confetti_ball" + ], + "ascii": [] + }, + { + "code": "1F38B", + "name": "tanabata_tree", + "skinTone": false, + "shortNames": [ + "tanabata_tree" + ], + "ascii": [] + }, + { + "code": "1F38D", + "name": "bamboo", + "skinTone": false, + "shortNames": [ + "bamboo" + ], + "ascii": [] + }, + { + "code": "1F38E", + "name": "dolls", + "skinTone": false, + "shortNames": [ + "dolls" + ], + "ascii": [] + }, + { + "code": "1F38F", + "name": "flags", + "skinTone": false, + "shortNames": [ + "flags" + ], + "ascii": [] + }, + { + "code": "1F390", + "name": "wind_chime", + "skinTone": false, + "shortNames": [ + "wind_chime" + ], + "ascii": [] + }, + { + "code": "1F391", + "name": "rice_scene", + "skinTone": false, + "shortNames": [ + "rice_scene" + ], + "ascii": [] + }, + { + "code": "1F380", + "name": "ribbon", + "skinTone": false, + "shortNames": [ + "ribbon" + ], + "ascii": [] + }, + { + "code": "1F381", + "name": "gift", + "skinTone": false, + "shortNames": [ + "gift" + ], + "ascii": [] + }, + { + "code": "1F397-FE0F", + "name": "reminder_ribbon", + "skinTone": false, + "shortNames": [ + "reminder_ribbon" + ], + "ascii": [] + }, + { + "code": "1F39F-FE0F", + "name": "admission_tickets", + "skinTone": false, + "shortNames": [ + "admission_tickets" + ], + "ascii": [] + }, + { + "code": "1F3AB", + "name": "ticket", + "skinTone": false, + "shortNames": [ + "ticket" + ], + "ascii": [] + }, + { + "code": "1F396-FE0F", + "name": "medal", + "skinTone": false, + "shortNames": [ + "medal" + ], + "ascii": [] + }, + { + "code": "1F3C6", + "name": "trophy", + "skinTone": false, + "shortNames": [ + "trophy" + ], + "ascii": [] + }, + { + "code": "1F3C5", + "name": "sports_medal", + "skinTone": false, + "shortNames": [ + "sports_medal" + ], + "ascii": [] + }, + { + "code": "1F947", + "name": "first_place_medal", + "skinTone": false, + "shortNames": [ + "first_place_medal" + ], + "ascii": [] + }, + { + "code": "1F948", + "name": "second_place_medal", + "skinTone": false, + "shortNames": [ + "second_place_medal" + ], + "ascii": [] + }, + { + "code": "1F949", + "name": "third_place_medal", + "skinTone": false, + "shortNames": [ + "third_place_medal" + ], + "ascii": [] + }, + { + "code": "26BD", + "name": "soccer", + "skinTone": false, + "shortNames": [ + "soccer" + ], + "ascii": [] + }, + { + "code": "26BE", + "name": "baseball", + "skinTone": false, + "shortNames": [ + "baseball" + ], + "ascii": [] + }, + { + "code": "1F3C0", + "name": "basketball", + "skinTone": false, + "shortNames": [ + "basketball" + ], + "ascii": [] + }, + { + "code": "1F3D0", + "name": "volleyball", + "skinTone": false, + "shortNames": [ + "volleyball" + ], + "ascii": [] + }, + { + "code": "1F3C8", + "name": "football", + "skinTone": false, + "shortNames": [ + "football" + ], + "ascii": [] + }, + { + "code": "1F3C9", + "name": "rugby_football", + "skinTone": false, + "shortNames": [ + "rugby_football" + ], + "ascii": [] + }, + { + "code": "1F3BE", + "name": "tennis", + "skinTone": false, + "shortNames": [ + "tennis" + ], + "ascii": [] + }, + { + "code": "1F3B1", + "name": "8ball", + "skinTone": false, + "shortNames": [ + "8ball" + ], + "ascii": [] + }, + { + "code": "1F3B3", + "name": "bowling", + "skinTone": false, + "shortNames": [ + "bowling" + ], + "ascii": [] + }, + { + "code": "1F3CF", + "name": "cricket_bat_and_ball", + "skinTone": false, + "shortNames": [ + "cricket_bat_and_ball" + ], + "ascii": [] + }, + { + "code": "1F3D1", + "name": "field_hockey_stick_and_ball", + "skinTone": false, + "shortNames": [ + "field_hockey_stick_and_ball" + ], + "ascii": [] + }, + { + "code": "1F3D2", + "name": "ice_hockey_stick_and_puck", + "skinTone": false, + "shortNames": [ + "ice_hockey_stick_and_puck" + ], + "ascii": [] + }, + { + "code": "1F3D3", + "name": "table_tennis_paddle_and_ball", + "skinTone": false, + "shortNames": [ + "table_tennis_paddle_and_ball" + ], + "ascii": [] + }, + { + "code": "1F3F8", + "name": "badminton_racquet_and_shuttlecock", + "skinTone": false, + "shortNames": [ + "badminton_racquet_and_shuttlecock" + ], + "ascii": [] + }, + { + "code": "1F94A", + "name": "boxing_glove", + "skinTone": false, + "shortNames": [ + "boxing_glove" + ], + "ascii": [] + }, + { + "code": "1F94B", + "name": "martial_arts_uniform", + "skinTone": false, + "shortNames": [ + "martial_arts_uniform" + ], + "ascii": [] + }, + { + "code": "1F945", + "name": "goal_net", + "skinTone": false, + "shortNames": [ + "goal_net" + ], + "ascii": [] + }, + { + "code": "1F3AF", + "name": "dart", + "skinTone": false, + "shortNames": [ + "dart" + ], + "ascii": [] + }, + { + "code": "26F3", + "name": "golf", + "skinTone": false, + "shortNames": [ + "golf" + ], + "ascii": [] + }, + { + "code": "26F8-FE0F", + "name": "ice_skate", + "skinTone": false, + "shortNames": [ + "ice_skate" + ], + "ascii": [] + }, + { + "code": "1F3A3", + "name": "fishing_pole_and_fish", + "skinTone": false, + "shortNames": [ + "fishing_pole_and_fish" + ], + "ascii": [] + }, + { + "code": "1F3BD", + "name": "running_shirt_with_sash", + "skinTone": false, + "shortNames": [ + "running_shirt_with_sash" + ], + "ascii": [] + }, + { + "code": "1F3BF", + "name": "ski", + "skinTone": false, + "shortNames": [ + "ski" + ], + "ascii": [] + }, + { + "code": "1F6F7", + "name": "sled", + "skinTone": false, + "shortNames": [ + "sled" + ], + "ascii": [] + }, + { + "code": "1F94C", + "name": "curling_stone", + "skinTone": false, + "shortNames": [ + "curling_stone" + ], + "ascii": [] + }, + { + "code": "1F3AE", + "name": "video_game", + "skinTone": false, + "shortNames": [ + "video_game" + ], + "ascii": [] + }, + { + "code": "1F579-FE0F", + "name": "joystick", + "skinTone": false, + "shortNames": [ + "joystick" + ], + "ascii": [] + }, + { + "code": "1F3B2", + "name": "game_die", + "skinTone": false, + "shortNames": [ + "game_die" + ], + "ascii": [] + }, + { + "code": "2660-FE0F", + "name": "spades", + "skinTone": false, + "shortNames": [ + "spades" + ], + "ascii": [] + }, + { + "code": "2665-FE0F", + "name": "hearts", + "skinTone": false, + "shortNames": [ + "hearts" + ], + "ascii": [] + }, + { + "code": "2666-FE0F", + "name": "diamonds", + "skinTone": false, + "shortNames": [ + "diamonds" + ], + "ascii": [] + }, + { + "code": "2663-FE0F", + "name": "clubs", + "skinTone": false, + "shortNames": [ + "clubs" + ], + "ascii": [] + }, + { + "code": "1F0CF", + "name": "black_joker", + "skinTone": false, + "shortNames": [ + "black_joker" + ], + "ascii": [] + }, + { + "code": "1F004", + "name": "mahjong", + "skinTone": false, + "shortNames": [ + "mahjong" + ], + "ascii": [] + }, + { + "code": "1F3B4", + "name": "flower_playing_cards", + "skinTone": false, + "shortNames": [ + "flower_playing_cards" + ], + "ascii": [] + } + ], + "travel_places": [ + { + "code": "1F30D", + "name": "earth_africa", + "skinTone": false, + "shortNames": [ + "earth_africa" + ], + "ascii": [] + }, + { + "code": "1F30E", + "name": "earth_americas", + "skinTone": false, + "shortNames": [ + "earth_americas" + ], + "ascii": [] + }, + { + "code": "1F30F", + "name": "earth_asia", + "skinTone": false, + "shortNames": [ + "earth_asia" + ], + "ascii": [] + }, + { + "code": "1F310", + "name": "globe_with_meridians", + "skinTone": false, + "shortNames": [ + "globe_with_meridians" + ], + "ascii": [] + }, + { + "code": "1F5FA-FE0F", + "name": "world_map", + "skinTone": false, + "shortNames": [ + "world_map" + ], + "ascii": [] + }, + { + "code": "1F5FE", + "name": "japan", + "skinTone": false, + "shortNames": [ + "japan" + ], + "ascii": [] + }, + { + "code": "1F3D4-FE0F", + "name": "snow_capped_mountain", + "skinTone": false, + "shortNames": [ + "snow_capped_mountain" + ], + "ascii": [] + }, + { + "code": "26F0-FE0F", + "name": "mountain", + "skinTone": false, + "shortNames": [ + "mountain" + ], + "ascii": [] + }, + { + "code": "1F30B", + "name": "volcano", + "skinTone": false, + "shortNames": [ + "volcano" + ], + "ascii": [] + }, + { + "code": "1F5FB", + "name": "mount_fuji", + "skinTone": false, + "shortNames": [ + "mount_fuji" + ], + "ascii": [] + }, + { + "code": "1F3D5-FE0F", + "name": "camping", + "skinTone": false, + "shortNames": [ + "camping" + ], + "ascii": [] + }, + { + "code": "1F3D6-FE0F", + "name": "beach_with_umbrella", + "skinTone": false, + "shortNames": [ + "beach_with_umbrella" + ], + "ascii": [] + }, + { + "code": "1F3DC-FE0F", + "name": "desert", + "skinTone": false, + "shortNames": [ + "desert" + ], + "ascii": [] + }, + { + "code": "1F3DD-FE0F", + "name": "desert_island", + "skinTone": false, + "shortNames": [ + "desert_island" + ], + "ascii": [] + }, + { + "code": "1F3DE-FE0F", + "name": "national_park", + "skinTone": false, + "shortNames": [ + "national_park" + ], + "ascii": [] + }, + { + "code": "1F3DF-FE0F", + "name": "stadium", + "skinTone": false, + "shortNames": [ + "stadium" + ], + "ascii": [] + }, + { + "code": "1F3DB-FE0F", + "name": "classical_building", + "skinTone": false, + "shortNames": [ + "classical_building" + ], + "ascii": [] + }, + { + "code": "1F3D7-FE0F", + "name": "building_construction", + "skinTone": false, + "shortNames": [ + "building_construction" + ], + "ascii": [] + }, + { + "code": "1F3D8-FE0F", + "name": "house_buildings", + "skinTone": false, + "shortNames": [ + "house_buildings" + ], + "ascii": [] + }, + { + "code": "1F3D9-FE0F", + "name": "cityscape", + "skinTone": false, + "shortNames": [ + "cityscape" + ], + "ascii": [] + }, + { + "code": "1F3DA-FE0F", + "name": "derelict_house_building", + "skinTone": false, + "shortNames": [ + "derelict_house_building" + ], + "ascii": [] + }, + { + "code": "1F3E0", + "name": "house", + "skinTone": false, + "shortNames": [ + "house" + ], + "ascii": [] + }, + { + "code": "1F3E1", + "name": "house_with_garden", + "skinTone": false, + "shortNames": [ + "house_with_garden" + ], + "ascii": [] + }, + { + "code": "1F3E2", + "name": "office", + "skinTone": false, + "shortNames": [ + "office" + ], + "ascii": [] + }, + { + "code": "1F3E3", + "name": "post_office", + "skinTone": false, + "shortNames": [ + "post_office" + ], + "ascii": [] + }, + { + "code": "1F3E4", + "name": "european_post_office", + "skinTone": false, + "shortNames": [ + "european_post_office" + ], + "ascii": [] + }, + { + "code": "1F3E5", + "name": "hospital", + "skinTone": false, + "shortNames": [ + "hospital" + ], + "ascii": [] + }, + { + "code": "1F3E6", + "name": "bank", + "skinTone": false, + "shortNames": [ + "bank" + ], + "ascii": [] + }, + { + "code": "1F3E8", + "name": "hotel", + "skinTone": false, + "shortNames": [ + "hotel" + ], + "ascii": [] + }, + { + "code": "1F3E9", + "name": "love_hotel", + "skinTone": false, + "shortNames": [ + "love_hotel" + ], + "ascii": [] + }, + { + "code": "1F3EA", + "name": "convenience_store", + "skinTone": false, + "shortNames": [ + "convenience_store" + ], + "ascii": [] + }, + { + "code": "1F3EB", + "name": "school", + "skinTone": false, + "shortNames": [ + "school" + ], + "ascii": [] + }, + { + "code": "1F3EC", + "name": "department_store", + "skinTone": false, + "shortNames": [ + "department_store" + ], + "ascii": [] + }, + { + "code": "1F3ED", + "name": "factory", + "skinTone": false, + "shortNames": [ + "factory" + ], + "ascii": [] + }, + { + "code": "1F3EF", + "name": "japanese_castle", + "skinTone": false, + "shortNames": [ + "japanese_castle" + ], + "ascii": [] + }, + { + "code": "1F3F0", + "name": "european_castle", + "skinTone": false, + "shortNames": [ + "european_castle" + ], + "ascii": [] + }, + { + "code": "1F492", + "name": "wedding", + "skinTone": false, + "shortNames": [ + "wedding" + ], + "ascii": [] + }, + { + "code": "1F5FC", + "name": "tokyo_tower", + "skinTone": false, + "shortNames": [ + "tokyo_tower" + ], + "ascii": [] + }, + { + "code": "1F5FD", + "name": "statue_of_liberty", + "skinTone": false, + "shortNames": [ + "statue_of_liberty" + ], + "ascii": [] + }, + { + "code": "26EA", + "name": "church", + "skinTone": false, + "shortNames": [ + "church" + ], + "ascii": [] + }, + { + "code": "1F54C", + "name": "mosque", + "skinTone": false, + "shortNames": [ + "mosque" + ], + "ascii": [] + }, + { + "code": "1F54D", + "name": "synagogue", + "skinTone": false, + "shortNames": [ + "synagogue" + ], + "ascii": [] + }, + { + "code": "26E9-FE0F", + "name": "shinto_shrine", + "skinTone": false, + "shortNames": [ + "shinto_shrine" + ], + "ascii": [] + }, + { + "code": "1F54B", + "name": "kaaba", + "skinTone": false, + "shortNames": [ + "kaaba" + ], + "ascii": [] + }, + { + "code": "26F2", + "name": "fountain", + "skinTone": false, + "shortNames": [ + "fountain" + ], + "ascii": [] + }, + { + "code": "26FA", + "name": "tent", + "skinTone": false, + "shortNames": [ + "tent" + ], + "ascii": [] + }, + { + "code": "1F301", + "name": "foggy", + "skinTone": false, + "shortNames": [ + "foggy" + ], + "ascii": [] + }, + { + "code": "1F303", + "name": "night_with_stars", + "skinTone": false, + "shortNames": [ + "night_with_stars" + ], + "ascii": [] + }, + { + "code": "1F304", + "name": "sunrise_over_mountains", + "skinTone": false, + "shortNames": [ + "sunrise_over_mountains" + ], + "ascii": [] + }, + { + "code": "1F305", + "name": "sunrise", + "skinTone": false, + "shortNames": [ + "sunrise" + ], + "ascii": [] + }, + { + "code": "1F306", + "name": "city_sunset", + "skinTone": false, + "shortNames": [ + "city_sunset" + ], + "ascii": [] + }, + { + "code": "1F307", + "name": "city_sunrise", + "skinTone": false, + "shortNames": [ + "city_sunrise" + ], + "ascii": [] + }, + { + "code": "1F309", + "name": "bridge_at_night", + "skinTone": false, + "shortNames": [ + "bridge_at_night" + ], + "ascii": [] + }, + { + "code": "2668-FE0F", + "name": "hotsprings", + "skinTone": false, + "shortNames": [ + "hotsprings" + ], + "ascii": [] + }, + { + "code": "1F30C", + "name": "milky_way", + "skinTone": false, + "shortNames": [ + "milky_way" + ], + "ascii": [] + }, + { + "code": "1F3A0", + "name": "carousel_horse", + "skinTone": false, + "shortNames": [ + "carousel_horse" + ], + "ascii": [] + }, + { + "code": "1F3A1", + "name": "ferris_wheel", + "skinTone": false, + "shortNames": [ + "ferris_wheel" + ], + "ascii": [] + }, + { + "code": "1F3A2", + "name": "roller_coaster", + "skinTone": false, + "shortNames": [ + "roller_coaster" + ], + "ascii": [] + }, + { + "code": "1F488", + "name": "barber", + "skinTone": false, + "shortNames": [ + "barber" + ], + "ascii": [] + }, + { + "code": "1F3AA", + "name": "circus_tent", + "skinTone": false, + "shortNames": [ + "circus_tent" + ], + "ascii": [] + }, + { + "code": "1F3AD", + "name": "performing_arts", + "skinTone": false, + "shortNames": [ + "performing_arts" + ], + "ascii": [] + }, + { + "code": "1F5BC-FE0F", + "name": "frame_with_picture", + "skinTone": false, + "shortNames": [ + "frame_with_picture" + ], + "ascii": [] + }, + { + "code": "1F3A8", + "name": "art", + "skinTone": false, + "shortNames": [ + "art" + ], + "ascii": [] + }, + { + "code": "1F3B0", + "name": "slot_machine", + "skinTone": false, + "shortNames": [ + "slot_machine" + ], + "ascii": [] + }, + { + "code": "1F682", + "name": "steam_locomotive", + "skinTone": false, + "shortNames": [ + "steam_locomotive" + ], + "ascii": [] + }, + { + "code": "1F683", + "name": "railway_car", + "skinTone": false, + "shortNames": [ + "railway_car" + ], + "ascii": [] + }, + { + "code": "1F684", + "name": "bullettrain_side", + "skinTone": false, + "shortNames": [ + "bullettrain_side" + ], + "ascii": [] + }, + { + "code": "1F685", + "name": "bullettrain_front", + "skinTone": false, + "shortNames": [ + "bullettrain_front" + ], + "ascii": [] + }, + { + "code": "1F686", + "name": "train2", + "skinTone": false, + "shortNames": [ + "train2" + ], + "ascii": [] + }, + { + "code": "1F687", + "name": "metro", + "skinTone": false, + "shortNames": [ + "metro" + ], + "ascii": [] + }, + { + "code": "1F688", + "name": "light_rail", + "skinTone": false, + "shortNames": [ + "light_rail" + ], + "ascii": [] + }, + { + "code": "1F689", + "name": "station", + "skinTone": false, + "shortNames": [ + "station" + ], + "ascii": [] + }, + { + "code": "1F68A", + "name": "tram", + "skinTone": false, + "shortNames": [ + "tram" + ], + "ascii": [] + }, + { + "code": "1F69D", + "name": "monorail", + "skinTone": false, + "shortNames": [ + "monorail" + ], + "ascii": [] + }, + { + "code": "1F69E", + "name": "mountain_railway", + "skinTone": false, + "shortNames": [ + "mountain_railway" + ], + "ascii": [] + }, + { + "code": "1F68B", + "name": "train", + "skinTone": false, + "shortNames": [ + "train" + ], + "ascii": [] + }, + { + "code": "1F68C", + "name": "bus", + "skinTone": false, + "shortNames": [ + "bus" + ], + "ascii": [] + }, + { + "code": "1F68D", + "name": "oncoming_bus", + "skinTone": false, + "shortNames": [ + "oncoming_bus" + ], + "ascii": [] + }, + { + "code": "1F68E", + "name": "trolleybus", + "skinTone": false, + "shortNames": [ + "trolleybus" + ], + "ascii": [] + }, + { + "code": "1F690", + "name": "minibus", + "skinTone": false, + "shortNames": [ + "minibus" + ], + "ascii": [] + }, + { + "code": "1F691", + "name": "ambulance", + "skinTone": false, + "shortNames": [ + "ambulance" + ], + "ascii": [] + }, + { + "code": "1F692", + "name": "fire_engine", + "skinTone": false, + "shortNames": [ + "fire_engine" + ], + "ascii": [] + }, + { + "code": "1F693", + "name": "police_car", + "skinTone": false, + "shortNames": [ + "police_car" + ], + "ascii": [] + }, + { + "code": "1F694", + "name": "oncoming_police_car", + "skinTone": false, + "shortNames": [ + "oncoming_police_car" + ], + "ascii": [] + }, + { + "code": "1F695", + "name": "taxi", + "skinTone": false, + "shortNames": [ + "taxi" + ], + "ascii": [] + }, + { + "code": "1F696", + "name": "oncoming_taxi", + "skinTone": false, + "shortNames": [ + "oncoming_taxi" + ], + "ascii": [] + }, + { + "code": "1F697", + "name": "car", + "skinTone": false, + "shortNames": [ + "car", + "red_car" + ], + "ascii": [] + }, + { + "code": "1F698", + "name": "oncoming_automobile", + "skinTone": false, + "shortNames": [ + "oncoming_automobile" + ], + "ascii": [] + }, + { + "code": "1F699", + "name": "blue_car", + "skinTone": false, + "shortNames": [ + "blue_car" + ], + "ascii": [] + }, + { + "code": "1F69A", + "name": "truck", + "skinTone": false, + "shortNames": [ + "truck" + ], + "ascii": [] + }, + { + "code": "1F69B", + "name": "articulated_lorry", + "skinTone": false, + "shortNames": [ + "articulated_lorry" + ], + "ascii": [] + }, + { + "code": "1F69C", + "name": "tractor", + "skinTone": false, + "shortNames": [ + "tractor" + ], + "ascii": [] + }, + { + "code": "1F6B2", + "name": "bike", + "skinTone": false, + "shortNames": [ + "bike" + ], + "ascii": [] + }, + { + "code": "1F6F4", + "name": "scooter", + "skinTone": false, + "shortNames": [ + "scooter" + ], + "ascii": [] + }, + { + "code": "1F6F5", + "name": "motor_scooter", + "skinTone": false, + "shortNames": [ + "motor_scooter" + ], + "ascii": [] + }, + { + "code": "1F68F", + "name": "busstop", + "skinTone": false, + "shortNames": [ + "busstop" + ], + "ascii": [] + }, + { + "code": "1F6E3-FE0F", + "name": "motorway", + "skinTone": false, + "shortNames": [ + "motorway" + ], + "ascii": [] + }, + { + "code": "1F6E4-FE0F", + "name": "railway_track", + "skinTone": false, + "shortNames": [ + "railway_track" + ], + "ascii": [] + }, + { + "code": "26FD", + "name": "fuelpump", + "skinTone": false, + "shortNames": [ + "fuelpump" + ], + "ascii": [] + }, + { + "code": "1F6A8", + "name": "rotating_light", + "skinTone": false, + "shortNames": [ + "rotating_light" + ], + "ascii": [] + }, + { + "code": "1F6A5", + "name": "traffic_light", + "skinTone": false, + "shortNames": [ + "traffic_light" + ], + "ascii": [] + }, + { + "code": "1F6A6", + "name": "vertical_traffic_light", + "skinTone": false, + "shortNames": [ + "vertical_traffic_light" + ], + "ascii": [] + }, + { + "code": "1F6A7", + "name": "construction", + "skinTone": false, + "shortNames": [ + "construction" + ], + "ascii": [] + }, + { + "code": "1F6D1", + "name": "octagonal_sign", + "skinTone": false, + "shortNames": [ + "octagonal_sign" + ], + "ascii": [] + }, + { + "code": "2693", + "name": "anchor", + "skinTone": false, + "shortNames": [ + "anchor" + ], + "ascii": [] + }, + { + "code": "26F5", + "name": "boat", + "skinTone": false, + "shortNames": [ + "boat", + "sailboat" + ], + "ascii": [] + }, + { + "code": "1F6F6", + "name": "canoe", + "skinTone": false, + "shortNames": [ + "canoe" + ], + "ascii": [] + }, + { + "code": "1F6A4", + "name": "speedboat", + "skinTone": false, + "shortNames": [ + "speedboat" + ], + "ascii": [] + }, + { + "code": "1F6F3-FE0F", + "name": "passenger_ship", + "skinTone": false, + "shortNames": [ + "passenger_ship" + ], + "ascii": [] + }, + { + "code": "26F4-FE0F", + "name": "ferry", + "skinTone": false, + "shortNames": [ + "ferry" + ], + "ascii": [] + }, + { + "code": "1F6E5-FE0F", + "name": "motor_boat", + "skinTone": false, + "shortNames": [ + "motor_boat" + ], + "ascii": [] + }, + { + "code": "1F6A2", + "name": "ship", + "skinTone": false, + "shortNames": [ + "ship" + ], + "ascii": [] + }, + { + "code": "2708-FE0F", + "name": "airplane", + "skinTone": false, + "shortNames": [ + "airplane" + ], + "ascii": [] + }, + { + "code": "1F6E9-FE0F", + "name": "small_airplane", + "skinTone": false, + "shortNames": [ + "small_airplane" + ], + "ascii": [] + }, + { + "code": "1F6EB", + "name": "airplane_departure", + "skinTone": false, + "shortNames": [ + "airplane_departure" + ], + "ascii": [] + }, + { + "code": "1F6EC", + "name": "airplane_arriving", + "skinTone": false, + "shortNames": [ + "airplane_arriving" + ], + "ascii": [] + }, + { + "code": "1F4BA", + "name": "seat", + "skinTone": false, + "shortNames": [ + "seat" + ], + "ascii": [] + }, + { + "code": "1F681", + "name": "helicopter", + "skinTone": false, + "shortNames": [ + "helicopter" + ], + "ascii": [] + }, + { + "code": "1F69F", + "name": "suspension_railway", + "skinTone": false, + "shortNames": [ + "suspension_railway" + ], + "ascii": [] + }, + { + "code": "1F6A0", + "name": "mountain_cableway", + "skinTone": false, + "shortNames": [ + "mountain_cableway" + ], + "ascii": [] + }, + { + "code": "1F6A1", + "name": "aerial_tramway", + "skinTone": false, + "shortNames": [ + "aerial_tramway" + ], + "ascii": [] + }, + { + "code": "1F6F0-FE0F", + "name": "satellite", + "skinTone": false, + "shortNames": [ + "satellite" + ], + "ascii": [] + }, + { + "code": "1F680", + "name": "rocket", + "skinTone": false, + "shortNames": [ + "rocket" + ], + "ascii": [] + }, + { + "code": "1F6F8", + "name": "flying_saucer", + "skinTone": false, + "shortNames": [ + "flying_saucer" + ], + "ascii": [] + }, + { + "code": "1F6CE-FE0F", + "name": "bellhop_bell", + "skinTone": false, + "shortNames": [ + "bellhop_bell" + ], + "ascii": [] + }, + { + "code": "1F6AA", + "name": "door", + "skinTone": false, + "shortNames": [ + "door" + ], + "ascii": [] + }, + { + "code": "1F6CF-FE0F", + "name": "bed", + "skinTone": false, + "shortNames": [ + "bed" + ], + "ascii": [] + }, + { + "code": "1F6CB-FE0F", + "name": "couch_and_lamp", + "skinTone": false, + "shortNames": [ + "couch_and_lamp" + ], + "ascii": [] + }, + { + "code": "1F6BD", + "name": "toilet", + "skinTone": false, + "shortNames": [ + "toilet" + ], + "ascii": [] + }, + { + "code": "1F6BF", + "name": "shower", + "skinTone": false, + "shortNames": [ + "shower" + ], + "ascii": [] + }, + { + "code": "1F6C1", + "name": "bathtub", + "skinTone": false, + "shortNames": [ + "bathtub" + ], + "ascii": [] + }, + { + "code": "231B", + "name": "hourglass", + "skinTone": false, + "shortNames": [ + "hourglass" + ], + "ascii": [] + }, + { + "code": "23F3", + "name": "hourglass_flowing_sand", + "skinTone": false, + "shortNames": [ + "hourglass_flowing_sand" + ], + "ascii": [] + }, + { + "code": "231A", + "name": "watch", + "skinTone": false, + "shortNames": [ + "watch" + ], + "ascii": [] + }, + { + "code": "23F0", + "name": "alarm_clock", + "skinTone": false, + "shortNames": [ + "alarm_clock" + ], + "ascii": [] + }, + { + "code": "23F1-FE0F", + "name": "stopwatch", + "skinTone": false, + "shortNames": [ + "stopwatch" + ], + "ascii": [] + }, + { + "code": "23F2-FE0F", + "name": "timer_clock", + "skinTone": false, + "shortNames": [ + "timer_clock" + ], + "ascii": [] + }, + { + "code": "1F570-FE0F", + "name": "mantelpiece_clock", + "skinTone": false, + "shortNames": [ + "mantelpiece_clock" + ], + "ascii": [] + }, + { + "code": "1F55B", + "name": "clock12", + "skinTone": false, + "shortNames": [ + "clock12" + ], + "ascii": [] + }, + { + "code": "1F567", + "name": "clock1230", + "skinTone": false, + "shortNames": [ + "clock1230" + ], + "ascii": [] + }, + { + "code": "1F550", + "name": "clock1", + "skinTone": false, + "shortNames": [ + "clock1" + ], + "ascii": [] + }, + { + "code": "1F55C", + "name": "clock130", + "skinTone": false, + "shortNames": [ + "clock130" + ], + "ascii": [] + }, + { + "code": "1F551", + "name": "clock2", + "skinTone": false, + "shortNames": [ + "clock2" + ], + "ascii": [] + }, + { + "code": "1F55D", + "name": "clock230", + "skinTone": false, + "shortNames": [ + "clock230" + ], + "ascii": [] + }, + { + "code": "1F552", + "name": "clock3", + "skinTone": false, + "shortNames": [ + "clock3" + ], + "ascii": [] + }, + { + "code": "1F55E", + "name": "clock330", + "skinTone": false, + "shortNames": [ + "clock330" + ], + "ascii": [] + }, + { + "code": "1F553", + "name": "clock4", + "skinTone": false, + "shortNames": [ + "clock4" + ], + "ascii": [] + }, + { + "code": "1F55F", + "name": "clock430", + "skinTone": false, + "shortNames": [ + "clock430" + ], + "ascii": [] + }, + { + "code": "1F554", + "name": "clock5", + "skinTone": false, + "shortNames": [ + "clock5" + ], + "ascii": [] + }, + { + "code": "1F560", + "name": "clock530", + "skinTone": false, + "shortNames": [ + "clock530" + ], + "ascii": [] + }, + { + "code": "1F555", + "name": "clock6", + "skinTone": false, + "shortNames": [ + "clock6" + ], + "ascii": [] + }, + { + "code": "1F561", + "name": "clock630", + "skinTone": false, + "shortNames": [ + "clock630" + ], + "ascii": [] + }, + { + "code": "1F556", + "name": "clock7", + "skinTone": false, + "shortNames": [ + "clock7" + ], + "ascii": [] + }, + { + "code": "1F562", + "name": "clock730", + "skinTone": false, + "shortNames": [ + "clock730" + ], + "ascii": [] + }, + { + "code": "1F557", + "name": "clock8", + "skinTone": false, + "shortNames": [ + "clock8" + ], + "ascii": [] + }, + { + "code": "1F563", + "name": "clock830", + "skinTone": false, + "shortNames": [ + "clock830" + ], + "ascii": [] + }, + { + "code": "1F558", + "name": "clock9", + "skinTone": false, + "shortNames": [ + "clock9" + ], + "ascii": [] + }, + { + "code": "1F564", + "name": "clock930", + "skinTone": false, + "shortNames": [ + "clock930" + ], + "ascii": [] + }, + { + "code": "1F559", + "name": "clock10", + "skinTone": false, + "shortNames": [ + "clock10" + ], + "ascii": [] + }, + { + "code": "1F565", + "name": "clock1030", + "skinTone": false, + "shortNames": [ + "clock1030" + ], + "ascii": [] + }, + { + "code": "1F55A", + "name": "clock11", + "skinTone": false, + "shortNames": [ + "clock11" + ], + "ascii": [] + }, + { + "code": "1F566", + "name": "clock1130", + "skinTone": false, + "shortNames": [ + "clock1130" + ], + "ascii": [] + }, + { + "code": "1F311", + "name": "new_moon", + "skinTone": false, + "shortNames": [ + "new_moon" + ], + "ascii": [] + }, + { + "code": "1F312", + "name": "waxing_crescent_moon", + "skinTone": false, + "shortNames": [ + "waxing_crescent_moon" + ], + "ascii": [] + }, + { + "code": "1F313", + "name": "first_quarter_moon", + "skinTone": false, + "shortNames": [ + "first_quarter_moon" + ], + "ascii": [] + }, + { + "code": "1F314", + "name": "moon", + "skinTone": false, + "shortNames": [ + "moon", + "waxing_gibbous_moon" + ], + "ascii": [] + }, + { + "code": "1F315", + "name": "full_moon", + "skinTone": false, + "shortNames": [ + "full_moon" + ], + "ascii": [] + }, + { + "code": "1F316", + "name": "waning_gibbous_moon", + "skinTone": false, + "shortNames": [ + "waning_gibbous_moon" + ], + "ascii": [] + }, + { + "code": "1F317", + "name": "last_quarter_moon", + "skinTone": false, + "shortNames": [ + "last_quarter_moon" + ], + "ascii": [] + }, + { + "code": "1F318", + "name": "waning_crescent_moon", + "skinTone": false, + "shortNames": [ + "waning_crescent_moon" + ], + "ascii": [] + }, + { + "code": "1F319", + "name": "crescent_moon", + "skinTone": false, + "shortNames": [ + "crescent_moon" + ], + "ascii": [] + }, + { + "code": "1F31A", + "name": "new_moon_with_face", + "skinTone": false, + "shortNames": [ + "new_moon_with_face" + ], + "ascii": [] + }, + { + "code": "1F31B", + "name": "first_quarter_moon_with_face", + "skinTone": false, + "shortNames": [ + "first_quarter_moon_with_face" + ], + "ascii": [] + }, + { + "code": "1F31C", + "name": "last_quarter_moon_with_face", + "skinTone": false, + "shortNames": [ + "last_quarter_moon_with_face" + ], + "ascii": [] + }, + { + "code": "1F321-FE0F", + "name": "thermometer", + "skinTone": false, + "shortNames": [ + "thermometer" + ], + "ascii": [] + }, + { + "code": "2600-FE0F", + "name": "sunny", + "skinTone": false, + "shortNames": [ + "sunny" + ], + "ascii": [] + }, + { + "code": "1F31D", + "name": "full_moon_with_face", + "skinTone": false, + "shortNames": [ + "full_moon_with_face" + ], + "ascii": [] + }, + { + "code": "1F31E", + "name": "sun_with_face", + "skinTone": false, + "shortNames": [ + "sun_with_face" + ], + "ascii": [] + }, + { + "code": "2B50", + "name": "star", + "skinTone": false, + "shortNames": [ + "star" + ], + "ascii": [] + }, + { + "code": "1F31F", + "name": "star2", + "skinTone": false, + "shortNames": [ + "star2" + ], + "ascii": [] + }, + { + "code": "1F320", + "name": "stars", + "skinTone": false, + "shortNames": [ + "stars" + ], + "ascii": [] + }, + { + "code": "2601-FE0F", + "name": "cloud", + "skinTone": false, + "shortNames": [ + "cloud" + ], + "ascii": [] + }, + { + "code": "26C5", + "name": "partly_sunny", + "skinTone": false, + "shortNames": [ + "partly_sunny" + ], + "ascii": [] + }, + { + "code": "26C8-FE0F", + "name": "thunder_cloud_and_rain", + "skinTone": false, + "shortNames": [ + "thunder_cloud_and_rain" + ], + "ascii": [] + }, + { + "code": "1F324-FE0F", + "name": "mostly_sunny", + "skinTone": false, + "shortNames": [ + "mostly_sunny", + "sun_small_cloud" + ], + "ascii": [] + }, + { + "code": "1F325-FE0F", + "name": "barely_sunny", + "skinTone": false, + "shortNames": [ + "barely_sunny", + "sun_behind_cloud" + ], + "ascii": [] + }, + { + "code": "1F326-FE0F", + "name": "partly_sunny_rain", + "skinTone": false, + "shortNames": [ + "partly_sunny_rain", + "sun_behind_rain_cloud" + ], + "ascii": [] + }, + { + "code": "1F327-FE0F", + "name": "rain_cloud", + "skinTone": false, + "shortNames": [ + "rain_cloud" + ], + "ascii": [] + }, + { + "code": "1F328-FE0F", + "name": "snow_cloud", + "skinTone": false, + "shortNames": [ + "snow_cloud" + ], + "ascii": [] + }, + { + "code": "1F329-FE0F", + "name": "lightning", + "skinTone": false, + "shortNames": [ + "lightning", + "lightning_cloud" + ], + "ascii": [] + }, + { + "code": "1F32A-FE0F", + "name": "tornado", + "skinTone": false, + "shortNames": [ + "tornado", + "tornado_cloud" + ], + "ascii": [] + }, + { + "code": "1F32B-FE0F", + "name": "fog", + "skinTone": false, + "shortNames": [ + "fog" + ], + "ascii": [] + }, + { + "code": "1F32C-FE0F", + "name": "wind_blowing_face", + "skinTone": false, + "shortNames": [ + "wind_blowing_face" + ], + "ascii": [] + }, + { + "code": "1F300", + "name": "cyclone", + "skinTone": false, + "shortNames": [ + "cyclone" + ], + "ascii": [] + }, + { + "code": "1F308", + "name": "rainbow", + "skinTone": false, + "shortNames": [ + "rainbow" + ], + "ascii": [] + }, + { + "code": "1F302", + "name": "closed_umbrella", + "skinTone": false, + "shortNames": [ + "closed_umbrella" + ], + "ascii": [] + }, + { + "code": "2602-FE0F", + "name": "umbrella", + "skinTone": false, + "shortNames": [ + "umbrella" + ], + "ascii": [] + }, + { + "code": "2614", + "name": "umbrella_with_rain_drops", + "skinTone": false, + "shortNames": [ + "umbrella_with_rain_drops" + ], + "ascii": [] + }, + { + "code": "26F1-FE0F", + "name": "umbrella_on_ground", + "skinTone": false, + "shortNames": [ + "umbrella_on_ground" + ], + "ascii": [] + }, + { + "code": "26A1", + "name": "zap", + "skinTone": false, + "shortNames": [ + "zap" + ], + "ascii": [] + }, + { + "code": "2744-FE0F", + "name": "snowflake", + "skinTone": false, + "shortNames": [ + "snowflake" + ], + "ascii": [] + }, + { + "code": "2603-FE0F", + "name": "snowman", + "skinTone": false, + "shortNames": [ + "snowman" + ], + "ascii": [] + }, + { + "code": "26C4", + "name": "snowman_without_snow", + "skinTone": false, + "shortNames": [ + "snowman_without_snow" + ], + "ascii": [] + }, + { + "code": "2604-FE0F", + "name": "comet", + "skinTone": false, + "shortNames": [ + "comet" + ], + "ascii": [] + }, + { + "code": "1F525", + "name": "fire", + "skinTone": false, + "shortNames": [ + "fire" + ], + "ascii": [] + }, + { + "code": "1F4A7", + "name": "droplet", + "skinTone": false, + "shortNames": [ + "droplet" + ], + "ascii": [] + }, + { + "code": "1F30A", + "name": "ocean", + "skinTone": false, + "shortNames": [ + "ocean" + ], + "ascii": [] + } + ], + "objects": [ + { + "code": "1F507", + "name": "mute", + "skinTone": false, + "shortNames": [ + "mute" + ], + "ascii": [] + }, + { + "code": "1F508", + "name": "speaker", + "skinTone": false, + "shortNames": [ + "speaker" + ], + "ascii": [] + }, + { + "code": "1F509", + "name": "sound", + "skinTone": false, + "shortNames": [ + "sound" + ], + "ascii": [] + }, + { + "code": "1F50A", + "name": "loud_sound", + "skinTone": false, + "shortNames": [ + "loud_sound" + ], + "ascii": [] + }, + { + "code": "1F4E2", + "name": "loudspeaker", + "skinTone": false, + "shortNames": [ + "loudspeaker" + ], + "ascii": [] + }, + { + "code": "1F4E3", + "name": "mega", + "skinTone": false, + "shortNames": [ + "mega" + ], + "ascii": [] + }, + { + "code": "1F4EF", + "name": "postal_horn", + "skinTone": false, + "shortNames": [ + "postal_horn" + ], + "ascii": [] + }, + { + "code": "1F514", + "name": "bell", + "skinTone": false, + "shortNames": [ + "bell" + ], + "ascii": [] + }, + { + "code": "1F515", + "name": "no_bell", + "skinTone": false, + "shortNames": [ + "no_bell" + ], + "ascii": [] + }, + { + "code": "1F3BC", + "name": "musical_score", + "skinTone": false, + "shortNames": [ + "musical_score" + ], + "ascii": [] + }, + { + "code": "1F3B5", + "name": "musical_note", + "skinTone": false, + "shortNames": [ + "musical_note" + ], + "ascii": [] + }, + { + "code": "1F3B6", + "name": "notes", + "skinTone": false, + "shortNames": [ + "notes" + ], + "ascii": [] + }, + { + "code": "1F399-FE0F", + "name": "studio_microphone", + "skinTone": false, + "shortNames": [ + "studio_microphone" + ], + "ascii": [] + }, + { + "code": "1F39A-FE0F", + "name": "level_slider", + "skinTone": false, + "shortNames": [ + "level_slider" + ], + "ascii": [] + }, + { + "code": "1F39B-FE0F", + "name": "control_knobs", + "skinTone": false, + "shortNames": [ + "control_knobs" + ], + "ascii": [] + }, + { + "code": "1F3A4", + "name": "microphone", + "skinTone": false, + "shortNames": [ + "microphone" + ], + "ascii": [] + }, + { + "code": "1F3A7", + "name": "headphones", + "skinTone": false, + "shortNames": [ + "headphones" + ], + "ascii": [] + }, + { + "code": "1F4FB", + "name": "radio", + "skinTone": false, + "shortNames": [ + "radio" + ], + "ascii": [] + }, + { + "code": "1F3B7", + "name": "saxophone", + "skinTone": false, + "shortNames": [ + "saxophone" + ], + "ascii": [] + }, + { + "code": "1F3B8", + "name": "guitar", + "skinTone": false, + "shortNames": [ + "guitar" + ], + "ascii": [] + }, + { + "code": "1F3B9", + "name": "musical_keyboard", + "skinTone": false, + "shortNames": [ + "musical_keyboard" + ], + "ascii": [] + }, + { + "code": "1F3BA", + "name": "trumpet", + "skinTone": false, + "shortNames": [ + "trumpet" + ], + "ascii": [] + }, + { + "code": "1F3BB", + "name": "violin", + "skinTone": false, + "shortNames": [ + "violin" + ], + "ascii": [] + }, + { + "code": "1F941", + "name": "drum_with_drumsticks", + "skinTone": false, + "shortNames": [ + "drum_with_drumsticks" + ], + "ascii": [] + }, + { + "code": "1F4F1", + "name": "iphone", + "skinTone": false, + "shortNames": [ + "iphone" + ], + "ascii": [] + }, + { + "code": "1F4F2", + "name": "calling", + "skinTone": false, + "shortNames": [ + "calling" + ], + "ascii": [] + }, + { + "code": "260E-FE0F", + "name": "phone", + "skinTone": false, + "shortNames": [ + "phone", + "telephone" + ], + "ascii": [] + }, + { + "code": "1F4DE", + "name": "telephone_receiver", + "skinTone": false, + "shortNames": [ + "telephone_receiver" + ], + "ascii": [] + }, + { + "code": "1F4DF", + "name": "pager", + "skinTone": false, + "shortNames": [ + "pager" + ], + "ascii": [] + }, + { + "code": "1F4E0", + "name": "fax", + "skinTone": false, + "shortNames": [ + "fax" + ], + "ascii": [] + }, + { + "code": "1F50B", + "name": "battery", + "skinTone": false, + "shortNames": [ + "battery" + ], + "ascii": [] + }, + { + "code": "1F50C", + "name": "electric_plug", + "skinTone": false, + "shortNames": [ + "electric_plug" + ], + "ascii": [] + }, + { + "code": "1F4BB", + "name": "computer", + "skinTone": false, + "shortNames": [ + "computer" + ], + "ascii": [] + }, + { + "code": "1F5A5-FE0F", + "name": "desktop_computer", + "skinTone": false, + "shortNames": [ + "desktop_computer" + ], + "ascii": [] + }, + { + "code": "1F5A8-FE0F", + "name": "printer", + "skinTone": false, + "shortNames": [ + "printer" + ], + "ascii": [] + }, + { + "code": "2328-FE0F", + "name": "keyboard", + "skinTone": false, + "shortNames": [ + "keyboard" + ], + "ascii": [] + }, + { + "code": "1F5B1-FE0F", + "name": "three_button_mouse", + "skinTone": false, + "shortNames": [ + "three_button_mouse" + ], + "ascii": [] + }, + { + "code": "1F5B2-FE0F", + "name": "trackball", + "skinTone": false, + "shortNames": [ + "trackball" + ], + "ascii": [] + }, + { + "code": "1F4BD", + "name": "minidisc", + "skinTone": false, + "shortNames": [ + "minidisc" + ], + "ascii": [] + }, + { + "code": "1F4BE", + "name": "floppy_disk", + "skinTone": false, + "shortNames": [ + "floppy_disk" + ], + "ascii": [] + }, + { + "code": "1F4BF", + "name": "cd", + "skinTone": false, + "shortNames": [ + "cd" + ], + "ascii": [] + }, + { + "code": "1F4C0", + "name": "dvd", + "skinTone": false, + "shortNames": [ + "dvd" + ], + "ascii": [] + }, + { + "code": "1F3A5", + "name": "movie_camera", + "skinTone": false, + "shortNames": [ + "movie_camera" + ], + "ascii": [] + }, + { + "code": "1F39E-FE0F", + "name": "film_frames", + "skinTone": false, + "shortNames": [ + "film_frames" + ], + "ascii": [] + }, + { + "code": "1F4FD-FE0F", + "name": "film_projector", + "skinTone": false, + "shortNames": [ + "film_projector" + ], + "ascii": [] + }, + { + "code": "1F3AC", + "name": "clapper", + "skinTone": false, + "shortNames": [ + "clapper" + ], + "ascii": [] + }, + { + "code": "1F4FA", + "name": "tv", + "skinTone": false, + "shortNames": [ + "tv" + ], + "ascii": [] + }, + { + "code": "1F4F7", + "name": "camera", + "skinTone": false, + "shortNames": [ + "camera" + ], + "ascii": [] + }, + { + "code": "1F4F8", + "name": "camera_with_flash", + "skinTone": false, + "shortNames": [ + "camera_with_flash" + ], + "ascii": [] + }, + { + "code": "1F4F9", + "name": "video_camera", + "skinTone": false, + "shortNames": [ + "video_camera" + ], + "ascii": [] + }, + { + "code": "1F4FC", + "name": "vhs", + "skinTone": false, + "shortNames": [ + "vhs" + ], + "ascii": [] + }, + { + "code": "1F50D", + "name": "mag", + "skinTone": false, + "shortNames": [ + "mag" + ], + "ascii": [] + }, + { + "code": "1F50E", + "name": "mag_right", + "skinTone": false, + "shortNames": [ + "mag_right" + ], + "ascii": [] + }, + { + "code": "1F52C", + "name": "microscope", + "skinTone": false, + "shortNames": [ + "microscope" + ], + "ascii": [] + }, + { + "code": "1F52D", + "name": "telescope", + "skinTone": false, + "shortNames": [ + "telescope" + ], + "ascii": [] + }, + { + "code": "1F4E1", + "name": "satellite_antenna", + "skinTone": false, + "shortNames": [ + "satellite_antenna" + ], + "ascii": [] + }, + { + "code": "1F56F-FE0F", + "name": "candle", + "skinTone": false, + "shortNames": [ + "candle" + ], + "ascii": [] + }, + { + "code": "1F4A1", + "name": "bulb", + "skinTone": false, + "shortNames": [ + "bulb" + ], + "ascii": [] + }, + { + "code": "1F526", + "name": "flashlight", + "skinTone": false, + "shortNames": [ + "flashlight" + ], + "ascii": [] + }, + { + "code": "1F3EE", + "name": "izakaya_lantern", + "skinTone": false, + "shortNames": [ + "izakaya_lantern", + "lantern" + ], + "ascii": [] + }, + { + "code": "1F4D4", + "name": "notebook_with_decorative_cover", + "skinTone": false, + "shortNames": [ + "notebook_with_decorative_cover" + ], + "ascii": [] + }, + { + "code": "1F4D5", + "name": "closed_book", + "skinTone": false, + "shortNames": [ + "closed_book" + ], + "ascii": [] + }, + { + "code": "1F4D6", + "name": "book", + "skinTone": false, + "shortNames": [ + "book", + "open_book" + ], + "ascii": [] + }, + { + "code": "1F4D7", + "name": "green_book", + "skinTone": false, + "shortNames": [ + "green_book" + ], + "ascii": [] + }, + { + "code": "1F4D8", + "name": "blue_book", + "skinTone": false, + "shortNames": [ + "blue_book" + ], + "ascii": [] + }, + { + "code": "1F4D9", + "name": "orange_book", + "skinTone": false, + "shortNames": [ + "orange_book" + ], + "ascii": [] + }, + { + "code": "1F4DA", + "name": "books", + "skinTone": false, + "shortNames": [ + "books" + ], + "ascii": [] + }, + { + "code": "1F4D3", + "name": "notebook", + "skinTone": false, + "shortNames": [ + "notebook" + ], + "ascii": [] + }, + { + "code": "1F4D2", + "name": "ledger", + "skinTone": false, + "shortNames": [ + "ledger" + ], + "ascii": [] + }, + { + "code": "1F4C3", + "name": "page_with_curl", + "skinTone": false, + "shortNames": [ + "page_with_curl" + ], + "ascii": [] + }, + { + "code": "1F4DC", + "name": "scroll", + "skinTone": false, + "shortNames": [ + "scroll" + ], + "ascii": [] + }, + { + "code": "1F4C4", + "name": "page_facing_up", + "skinTone": false, + "shortNames": [ + "page_facing_up" + ], + "ascii": [] + }, + { + "code": "1F4F0", + "name": "newspaper", + "skinTone": false, + "shortNames": [ + "newspaper" + ], + "ascii": [] + }, + { + "code": "1F5DE-FE0F", + "name": "rolled_up_newspaper", + "skinTone": false, + "shortNames": [ + "rolled_up_newspaper" + ], + "ascii": [] + }, + { + "code": "1F4D1", + "name": "bookmark_tabs", + "skinTone": false, + "shortNames": [ + "bookmark_tabs" + ], + "ascii": [] + }, + { + "code": "1F516", + "name": "bookmark", + "skinTone": false, + "shortNames": [ + "bookmark" + ], + "ascii": [] + }, + { + "code": "1F3F7-FE0F", + "name": "label", + "skinTone": false, + "shortNames": [ + "label" + ], + "ascii": [] + }, + { + "code": "1F4B0", + "name": "moneybag", + "skinTone": false, + "shortNames": [ + "moneybag" + ], + "ascii": [] + }, + { + "code": "1F4B4", + "name": "yen", + "skinTone": false, + "shortNames": [ + "yen" + ], + "ascii": [] + }, + { + "code": "1F4B5", + "name": "dollar", + "skinTone": false, + "shortNames": [ + "dollar" + ], + "ascii": [] + }, + { + "code": "1F4B6", + "name": "euro", + "skinTone": false, + "shortNames": [ + "euro" + ], + "ascii": [] + }, + { + "code": "1F4B7", + "name": "pound", + "skinTone": false, + "shortNames": [ + "pound" + ], + "ascii": [] + }, + { + "code": "1F4B8", + "name": "money_with_wings", + "skinTone": false, + "shortNames": [ + "money_with_wings" + ], + "ascii": [] + }, + { + "code": "1F4B3", + "name": "credit_card", + "skinTone": false, + "shortNames": [ + "credit_card" + ], + "ascii": [] + }, + { + "code": "1F4B9", + "name": "chart", + "skinTone": false, + "shortNames": [ + "chart" + ], + "ascii": [] + }, + { + "code": "1F4B1", + "name": "currency_exchange", + "skinTone": false, + "shortNames": [ + "currency_exchange" + ], + "ascii": [] + }, + { + "code": "1F4B2", + "name": "heavy_dollar_sign", + "skinTone": false, + "shortNames": [ + "heavy_dollar_sign" + ], + "ascii": [] + }, + { + "code": "2709-FE0F", + "name": "email", + "skinTone": false, + "shortNames": [ + "email", + "envelope" + ], + "ascii": [] + }, + { + "code": "1F4E7", + "name": "e-mail", + "skinTone": false, + "shortNames": [ + "e-mail" + ], + "ascii": [] + }, + { + "code": "1F4E8", + "name": "incoming_envelope", + "skinTone": false, + "shortNames": [ + "incoming_envelope" + ], + "ascii": [] + }, + { + "code": "1F4E9", + "name": "envelope_with_arrow", + "skinTone": false, + "shortNames": [ + "envelope_with_arrow" + ], + "ascii": [] + }, + { + "code": "1F4E4", + "name": "outbox_tray", + "skinTone": false, + "shortNames": [ + "outbox_tray" + ], + "ascii": [] + }, + { + "code": "1F4E5", + "name": "inbox_tray", + "skinTone": false, + "shortNames": [ + "inbox_tray" + ], + "ascii": [] + }, + { + "code": "1F4E6", + "name": "package", + "skinTone": false, + "shortNames": [ + "package" + ], + "ascii": [] + }, + { + "code": "1F4EB", + "name": "mailbox", + "skinTone": false, + "shortNames": [ + "mailbox" + ], + "ascii": [] + }, + { + "code": "1F4EA", + "name": "mailbox_closed", + "skinTone": false, + "shortNames": [ + "mailbox_closed" + ], + "ascii": [] + }, + { + "code": "1F4EC", + "name": "mailbox_with_mail", + "skinTone": false, + "shortNames": [ + "mailbox_with_mail" + ], + "ascii": [] + }, + { + "code": "1F4ED", + "name": "mailbox_with_no_mail", + "skinTone": false, + "shortNames": [ + "mailbox_with_no_mail" + ], + "ascii": [] + }, + { + "code": "1F4EE", + "name": "postbox", + "skinTone": false, + "shortNames": [ + "postbox" + ], + "ascii": [] + }, + { + "code": "1F5F3-FE0F", + "name": "ballot_box_with_ballot", + "skinTone": false, + "shortNames": [ + "ballot_box_with_ballot" + ], + "ascii": [] + }, + { + "code": "270F-FE0F", + "name": "pencil2", + "skinTone": false, + "shortNames": [ + "pencil2" + ], + "ascii": [] + }, + { + "code": "2712-FE0F", + "name": "black_nib", + "skinTone": false, + "shortNames": [ + "black_nib" + ], + "ascii": [] + }, + { + "code": "1F58B-FE0F", + "name": "lower_left_fountain_pen", + "skinTone": false, + "shortNames": [ + "lower_left_fountain_pen" + ], + "ascii": [] + }, + { + "code": "1F58A-FE0F", + "name": "lower_left_ballpoint_pen", + "skinTone": false, + "shortNames": [ + "lower_left_ballpoint_pen" + ], + "ascii": [] + }, + { + "code": "1F58C-FE0F", + "name": "lower_left_paintbrush", + "skinTone": false, + "shortNames": [ + "lower_left_paintbrush" + ], + "ascii": [] + }, + { + "code": "1F58D-FE0F", + "name": "lower_left_crayon", + "skinTone": false, + "shortNames": [ + "lower_left_crayon" + ], + "ascii": [] + }, + { + "code": "1F4DD", + "name": "memo", + "skinTone": false, + "shortNames": [ + "memo", + "pencil" + ], + "ascii": [] + }, + { + "code": "1F4BC", + "name": "briefcase", + "skinTone": false, + "shortNames": [ + "briefcase" + ], + "ascii": [] + }, + { + "code": "1F4C1", + "name": "file_folder", + "skinTone": false, + "shortNames": [ + "file_folder" + ], + "ascii": [] + }, + { + "code": "1F4C2", + "name": "open_file_folder", + "skinTone": false, + "shortNames": [ + "open_file_folder" + ], + "ascii": [] + }, + { + "code": "1F5C2-FE0F", + "name": "card_index_dividers", + "skinTone": false, + "shortNames": [ + "card_index_dividers" + ], + "ascii": [] + }, + { + "code": "1F4C5", + "name": "date", + "skinTone": false, + "shortNames": [ + "date" + ], + "ascii": [] + }, + { + "code": "1F4C6", + "name": "calendar", + "skinTone": false, + "shortNames": [ + "calendar" + ], + "ascii": [] + }, + { + "code": "1F5D2-FE0F", + "name": "spiral_note_pad", + "skinTone": false, + "shortNames": [ + "spiral_note_pad" + ], + "ascii": [] + }, + { + "code": "1F5D3-FE0F", + "name": "spiral_calendar_pad", + "skinTone": false, + "shortNames": [ + "spiral_calendar_pad" + ], + "ascii": [] + }, + { + "code": "1F4C7", + "name": "card_index", + "skinTone": false, + "shortNames": [ + "card_index" + ], + "ascii": [] + }, + { + "code": "1F4C8", + "name": "chart_with_upwards_trend", + "skinTone": false, + "shortNames": [ + "chart_with_upwards_trend" + ], + "ascii": [] + }, + { + "code": "1F4C9", + "name": "chart_with_downwards_trend", + "skinTone": false, + "shortNames": [ + "chart_with_downwards_trend" + ], + "ascii": [] + }, + { + "code": "1F4CA", + "name": "bar_chart", + "skinTone": false, + "shortNames": [ + "bar_chart" + ], + "ascii": [] + }, + { + "code": "1F4CB", + "name": "clipboard", + "skinTone": false, + "shortNames": [ + "clipboard" + ], + "ascii": [] + }, + { + "code": "1F4CC", + "name": "pushpin", + "skinTone": false, + "shortNames": [ + "pushpin" + ], + "ascii": [] + }, + { + "code": "1F4CD", + "name": "round_pushpin", + "skinTone": false, + "shortNames": [ + "round_pushpin" + ], + "ascii": [] + }, + { + "code": "1F4CE", + "name": "paperclip", + "skinTone": false, + "shortNames": [ + "paperclip" + ], + "ascii": [] + }, + { + "code": "1F587-FE0F", + "name": "linked_paperclips", + "skinTone": false, + "shortNames": [ + "linked_paperclips" + ], + "ascii": [] + }, + { + "code": "1F4CF", + "name": "straight_ruler", + "skinTone": false, + "shortNames": [ + "straight_ruler" + ], + "ascii": [] + }, + { + "code": "1F4D0", + "name": "triangular_ruler", + "skinTone": false, + "shortNames": [ + "triangular_ruler" + ], + "ascii": [] + }, + { + "code": "2702-FE0F", + "name": "scissors", + "skinTone": false, + "shortNames": [ + "scissors" + ], + "ascii": [] + }, + { + "code": "1F5C3-FE0F", + "name": "card_file_box", + "skinTone": false, + "shortNames": [ + "card_file_box" + ], + "ascii": [] + }, + { + "code": "1F5C4-FE0F", + "name": "file_cabinet", + "skinTone": false, + "shortNames": [ + "file_cabinet" + ], + "ascii": [] + }, + { + "code": "1F5D1-FE0F", + "name": "wastebasket", + "skinTone": false, + "shortNames": [ + "wastebasket" + ], + "ascii": [] + }, + { + "code": "1F512", + "name": "lock", + "skinTone": false, + "shortNames": [ + "lock" + ], + "ascii": [] + }, + { + "code": "1F513", + "name": "unlock", + "skinTone": false, + "shortNames": [ + "unlock" + ], + "ascii": [] + }, + { + "code": "1F50F", + "name": "lock_with_ink_pen", + "skinTone": false, + "shortNames": [ + "lock_with_ink_pen" + ], + "ascii": [] + }, + { + "code": "1F510", + "name": "closed_lock_with_key", + "skinTone": false, + "shortNames": [ + "closed_lock_with_key" + ], + "ascii": [] + }, + { + "code": "1F511", + "name": "key", + "skinTone": false, + "shortNames": [ + "key" + ], + "ascii": [] + }, + { + "code": "1F5DD-FE0F", + "name": "old_key", + "skinTone": false, + "shortNames": [ + "old_key" + ], + "ascii": [] + }, + { + "code": "1F528", + "name": "hammer", + "skinTone": false, + "shortNames": [ + "hammer" + ], + "ascii": [] + }, + { + "code": "26CF-FE0F", + "name": "pick", + "skinTone": false, + "shortNames": [ + "pick" + ], + "ascii": [] + }, + { + "code": "2692-FE0F", + "name": "hammer_and_pick", + "skinTone": false, + "shortNames": [ + "hammer_and_pick" + ], + "ascii": [] + }, + { + "code": "1F6E0-FE0F", + "name": "hammer_and_wrench", + "skinTone": false, + "shortNames": [ + "hammer_and_wrench" + ], + "ascii": [] + }, + { + "code": "1F5E1-FE0F", + "name": "dagger_knife", + "skinTone": false, + "shortNames": [ + "dagger_knife" + ], + "ascii": [] + }, + { + "code": "2694-FE0F", + "name": "crossed_swords", + "skinTone": false, + "shortNames": [ + "crossed_swords" + ], + "ascii": [] + }, + { + "code": "1F52B", + "name": "gun", + "skinTone": false, + "shortNames": [ + "gun" + ], + "ascii": [] + }, + { + "code": "1F3F9", + "name": "bow_and_arrow", + "skinTone": false, + "shortNames": [ + "bow_and_arrow" + ], + "ascii": [] + }, + { + "code": "1F6E1-FE0F", + "name": "shield", + "skinTone": false, + "shortNames": [ + "shield" + ], + "ascii": [] + }, + { + "code": "1F527", + "name": "wrench", + "skinTone": false, + "shortNames": [ + "wrench" + ], + "ascii": [] + }, + { + "code": "1F529", + "name": "nut_and_bolt", + "skinTone": false, + "shortNames": [ + "nut_and_bolt" + ], + "ascii": [] + }, + { + "code": "2699-FE0F", + "name": "gear", + "skinTone": false, + "shortNames": [ + "gear" + ], + "ascii": [] + }, + { + "code": "1F5DC-FE0F", + "name": "compression", + "skinTone": false, + "shortNames": [ + "compression" + ], + "ascii": [] + }, + { + "code": "2697-FE0F", + "name": "alembic", + "skinTone": false, + "shortNames": [ + "alembic" + ], + "ascii": [] + }, + { + "code": "2696-FE0F", + "name": "scales", + "skinTone": false, + "shortNames": [ + "scales" + ], + "ascii": [] + }, + { + "code": "1F517", + "name": "link", + "skinTone": false, + "shortNames": [ + "link" + ], + "ascii": [] + }, + { + "code": "26D3-FE0F", + "name": "chains", + "skinTone": false, + "shortNames": [ + "chains" + ], + "ascii": [] + }, + { + "code": "1F489", + "name": "syringe", + "skinTone": false, + "shortNames": [ + "syringe" + ], + "ascii": [] + }, + { + "code": "1F48A", + "name": "pill", + "skinTone": false, + "shortNames": [ + "pill" + ], + "ascii": [] + }, + { + "code": "1F6AC", + "name": "smoking", + "skinTone": false, + "shortNames": [ + "smoking" + ], + "ascii": [] + }, + { + "code": "26B0-FE0F", + "name": "coffin", + "skinTone": false, + "shortNames": [ + "coffin" + ], + "ascii": [] + }, + { + "code": "26B1-FE0F", + "name": "funeral_urn", + "skinTone": false, + "shortNames": [ + "funeral_urn" + ], + "ascii": [] + }, + { + "code": "1F5FF", + "name": "moyai", + "skinTone": false, + "shortNames": [ + "moyai" + ], + "ascii": [] + }, + { + "code": "1F6E2-FE0F", + "name": "oil_drum", + "skinTone": false, + "shortNames": [ + "oil_drum" + ], + "ascii": [] + }, + { + "code": "1F52E", + "name": "crystal_ball", + "skinTone": false, + "shortNames": [ + "crystal_ball" + ], + "ascii": [] + }, + { + "code": "1F6D2", + "name": "shopping_trolley", + "skinTone": false, + "shortNames": [ + "shopping_trolley" + ], + "ascii": [] + } + ], + "symbols": [ + { + "code": "1F3E7", + "name": "atm", + "skinTone": false, + "shortNames": [ + "atm" + ], + "ascii": [] + }, + { + "code": "1F6AE", + "name": "put_litter_in_its_place", + "skinTone": false, + "shortNames": [ + "put_litter_in_its_place" + ], + "ascii": [] + }, + { + "code": "1F6B0", + "name": "potable_water", + "skinTone": false, + "shortNames": [ + "potable_water" + ], + "ascii": [] + }, + { + "code": "267F", + "name": "wheelchair", + "skinTone": false, + "shortNames": [ + "wheelchair" + ], + "ascii": [] + }, + { + "code": "1F6B9", + "name": "mens", + "skinTone": false, + "shortNames": [ + "mens" + ], + "ascii": [] + }, + { + "code": "1F6BA", + "name": "womens", + "skinTone": false, + "shortNames": [ + "womens" + ], + "ascii": [] + }, + { + "code": "1F6BB", + "name": "restroom", + "skinTone": false, + "shortNames": [ + "restroom" + ], + "ascii": [] + }, + { + "code": "1F6BC", + "name": "baby_symbol", + "skinTone": false, + "shortNames": [ + "baby_symbol" + ], + "ascii": [] + }, + { + "code": "1F6BE", + "name": "wc", + "skinTone": false, + "shortNames": [ + "wc" + ], + "ascii": [] + }, + { + "code": "1F6C2", + "name": "passport_control", + "skinTone": false, + "shortNames": [ + "passport_control" + ], + "ascii": [] + }, + { + "code": "1F6C3", + "name": "customs", + "skinTone": false, + "shortNames": [ + "customs" + ], + "ascii": [] + }, + { + "code": "1F6C4", + "name": "baggage_claim", + "skinTone": false, + "shortNames": [ + "baggage_claim" + ], + "ascii": [] + }, + { + "code": "1F6C5", + "name": "left_luggage", + "skinTone": false, + "shortNames": [ + "left_luggage" + ], + "ascii": [] + }, + { + "code": "26A0-FE0F", + "name": "warning", + "skinTone": false, + "shortNames": [ + "warning" + ], + "ascii": [] + }, + { + "code": "1F6B8", + "name": "children_crossing", + "skinTone": false, + "shortNames": [ + "children_crossing" + ], + "ascii": [] + }, + { + "code": "26D4", + "name": "no_entry", + "skinTone": false, + "shortNames": [ + "no_entry" + ], + "ascii": [] + }, + { + "code": "1F6AB", + "name": "no_entry_sign", + "skinTone": false, + "shortNames": [ + "no_entry_sign" + ], + "ascii": [] + }, + { + "code": "1F6B3", + "name": "no_bicycles", + "skinTone": false, + "shortNames": [ + "no_bicycles" + ], + "ascii": [] + }, + { + "code": "1F6AD", + "name": "no_smoking", + "skinTone": false, + "shortNames": [ + "no_smoking" + ], + "ascii": [] + }, + { + "code": "1F6AF", + "name": "do_not_litter", + "skinTone": false, + "shortNames": [ + "do_not_litter" + ], + "ascii": [] + }, + { + "code": "1F6B1", + "name": "non-potable_water", + "skinTone": false, + "shortNames": [ + "non-potable_water" + ], + "ascii": [] + }, + { + "code": "1F6B7", + "name": "no_pedestrians", + "skinTone": false, + "shortNames": [ + "no_pedestrians" + ], + "ascii": [] + }, + { + "code": "1F4F5", + "name": "no_mobile_phones", + "skinTone": false, + "shortNames": [ + "no_mobile_phones" + ], + "ascii": [] + }, + { + "code": "1F51E", + "name": "underage", + "skinTone": false, + "shortNames": [ + "underage" + ], + "ascii": [] + }, + { + "code": "2622-FE0F", + "name": "radioactive_sign", + "skinTone": false, + "shortNames": [ + "radioactive_sign" + ], + "ascii": [] + }, + { + "code": "2623-FE0F", + "name": "biohazard_sign", + "skinTone": false, + "shortNames": [ + "biohazard_sign" + ], + "ascii": [] + }, + { + "code": "2B06-FE0F", + "name": "arrow_up", + "skinTone": false, + "shortNames": [ + "arrow_up" + ], + "ascii": [] + }, + { + "code": "2197-FE0F", + "name": "arrow_upper_right", + "skinTone": false, + "shortNames": [ + "arrow_upper_right" + ], + "ascii": [] + }, + { + "code": "27A1-FE0F", + "name": "arrow_right", + "skinTone": false, + "shortNames": [ + "arrow_right" + ], + "ascii": [] + }, + { + "code": "2198-FE0F", + "name": "arrow_lower_right", + "skinTone": false, + "shortNames": [ + "arrow_lower_right" + ], + "ascii": [] + }, + { + "code": "2B07-FE0F", + "name": "arrow_down", + "skinTone": false, + "shortNames": [ + "arrow_down" + ], + "ascii": [] + }, + { + "code": "2199-FE0F", + "name": "arrow_lower_left", + "skinTone": false, + "shortNames": [ + "arrow_lower_left" + ], + "ascii": [] + }, + { + "code": "2B05-FE0F", + "name": "arrow_left", + "skinTone": false, + "shortNames": [ + "arrow_left" + ], + "ascii": [] + }, + { + "code": "2196-FE0F", + "name": "arrow_upper_left", + "skinTone": false, + "shortNames": [ + "arrow_upper_left" + ], + "ascii": [] + }, + { + "code": "2195-FE0F", + "name": "arrow_up_down", + "skinTone": false, + "shortNames": [ + "arrow_up_down" + ], + "ascii": [] + }, + { + "code": "2194-FE0F", + "name": "left_right_arrow", + "skinTone": false, + "shortNames": [ + "left_right_arrow" + ], + "ascii": [] + }, + { + "code": "21A9-FE0F", + "name": "leftwards_arrow_with_hook", + "skinTone": false, + "shortNames": [ + "leftwards_arrow_with_hook" + ], + "ascii": [] + }, + { + "code": "21AA-FE0F", + "name": "arrow_right_hook", + "skinTone": false, + "shortNames": [ + "arrow_right_hook" + ], + "ascii": [] + }, + { + "code": "2934-FE0F", + "name": "arrow_heading_up", + "skinTone": false, + "shortNames": [ + "arrow_heading_up" + ], + "ascii": [] + }, + { + "code": "2935-FE0F", + "name": "arrow_heading_down", + "skinTone": false, + "shortNames": [ + "arrow_heading_down" + ], + "ascii": [] + }, + { + "code": "1F503", + "name": "arrows_clockwise", + "skinTone": false, + "shortNames": [ + "arrows_clockwise" + ], + "ascii": [] + }, + { + "code": "1F504", + "name": "arrows_counterclockwise", + "skinTone": false, + "shortNames": [ + "arrows_counterclockwise" + ], + "ascii": [] + }, + { + "code": "1F519", + "name": "back", + "skinTone": false, + "shortNames": [ + "back" + ], + "ascii": [] + }, + { + "code": "1F51A", + "name": "end", + "skinTone": false, + "shortNames": [ + "end" + ], + "ascii": [] + }, + { + "code": "1F51B", + "name": "on", + "skinTone": false, + "shortNames": [ + "on" + ], + "ascii": [] + }, + { + "code": "1F51C", + "name": "soon", + "skinTone": false, + "shortNames": [ + "soon" + ], + "ascii": [] + }, + { + "code": "1F51D", + "name": "top", + "skinTone": false, + "shortNames": [ + "top" + ], + "ascii": [] + }, + { + "code": "1F6D0", + "name": "place_of_worship", + "skinTone": false, + "shortNames": [ + "place_of_worship" + ], + "ascii": [] + }, + { + "code": "269B-FE0F", + "name": "atom_symbol", + "skinTone": false, + "shortNames": [ + "atom_symbol" + ], + "ascii": [] + }, + { + "code": "1F549-FE0F", + "name": "om_symbol", + "skinTone": false, + "shortNames": [ + "om_symbol" + ], + "ascii": [] + }, + { + "code": "2721-FE0F", + "name": "star_of_david", + "skinTone": false, + "shortNames": [ + "star_of_david" + ], + "ascii": [] + }, + { + "code": "2638-FE0F", + "name": "wheel_of_dharma", + "skinTone": false, + "shortNames": [ + "wheel_of_dharma" + ], + "ascii": [] + }, + { + "code": "262F-FE0F", + "name": "yin_yang", + "skinTone": false, + "shortNames": [ + "yin_yang" + ], + "ascii": [] + }, + { + "code": "271D-FE0F", + "name": "latin_cross", + "skinTone": false, + "shortNames": [ + "latin_cross" + ], + "ascii": [] + }, + { + "code": "2626-FE0F", + "name": "orthodox_cross", + "skinTone": false, + "shortNames": [ + "orthodox_cross" + ], + "ascii": [] + }, + { + "code": "262A-FE0F", + "name": "star_and_crescent", + "skinTone": false, + "shortNames": [ + "star_and_crescent" + ], + "ascii": [] + }, + { + "code": "262E-FE0F", + "name": "peace_symbol", + "skinTone": false, + "shortNames": [ + "peace_symbol" + ], + "ascii": [] + }, + { + "code": "1F54E", + "name": "menorah_with_nine_branches", + "skinTone": false, + "shortNames": [ + "menorah_with_nine_branches" + ], + "ascii": [] + }, + { + "code": "1F52F", + "name": "six_pointed_star", + "skinTone": false, + "shortNames": [ + "six_pointed_star" + ], + "ascii": [] + }, + { + "code": "2648", + "name": "aries", + "skinTone": false, + "shortNames": [ + "aries" + ], + "ascii": [] + }, + { + "code": "2649", + "name": "taurus", + "skinTone": false, + "shortNames": [ + "taurus" + ], + "ascii": [] + }, + { + "code": "264A", + "name": "gemini", + "skinTone": false, + "shortNames": [ + "gemini" + ], + "ascii": [] + }, + { + "code": "264B", + "name": "cancer", + "skinTone": false, + "shortNames": [ + "cancer" + ], + "ascii": [] + }, + { + "code": "264C", + "name": "leo", + "skinTone": false, + "shortNames": [ + "leo" + ], + "ascii": [] + }, + { + "code": "264D", + "name": "virgo", + "skinTone": false, + "shortNames": [ + "virgo" + ], + "ascii": [] + }, + { + "code": "264E", + "name": "libra", + "skinTone": false, + "shortNames": [ + "libra" + ], + "ascii": [] + }, + { + "code": "264F", + "name": "scorpius", + "skinTone": false, + "shortNames": [ + "scorpius" + ], + "ascii": [] + }, + { + "code": "2650", + "name": "sagittarius", + "skinTone": false, + "shortNames": [ + "sagittarius" + ], + "ascii": [] + }, + { + "code": "2651", + "name": "capricorn", + "skinTone": false, + "shortNames": [ + "capricorn" + ], + "ascii": [] + }, + { + "code": "2652", + "name": "aquarius", + "skinTone": false, + "shortNames": [ + "aquarius" + ], + "ascii": [] + }, + { + "code": "2653", + "name": "pisces", + "skinTone": false, + "shortNames": [ + "pisces" + ], + "ascii": [] + }, + { + "code": "26CE", + "name": "ophiuchus", + "skinTone": false, + "shortNames": [ + "ophiuchus" + ], + "ascii": [] + }, + { + "code": "1F500", + "name": "twisted_rightwards_arrows", + "skinTone": false, + "shortNames": [ + "twisted_rightwards_arrows" + ], + "ascii": [] + }, + { + "code": "1F501", + "name": "repeat", + "skinTone": false, + "shortNames": [ + "repeat" + ], + "ascii": [] + }, + { + "code": "1F502", + "name": "repeat_one", + "skinTone": false, + "shortNames": [ + "repeat_one" + ], + "ascii": [] + }, + { + "code": "25B6-FE0F", + "name": "arrow_forward", + "skinTone": false, + "shortNames": [ + "arrow_forward" + ], + "ascii": [] + }, + { + "code": "23E9", + "name": "fast_forward", + "skinTone": false, + "shortNames": [ + "fast_forward" + ], + "ascii": [] + }, + { + "code": "23ED-FE0F", + "name": "black_right_pointing_double_triangle_with_vertical_bar", + "skinTone": false, + "shortNames": [ + "black_right_pointing_double_triangle_with_vertical_bar" + ], + "ascii": [] + }, + { + "code": "23EF-FE0F", + "name": "black_right_pointing_triangle_with_double_vertical_bar", + "skinTone": false, + "shortNames": [ + "black_right_pointing_triangle_with_double_vertical_bar" + ], + "ascii": [] + }, + { + "code": "25C0-FE0F", + "name": "arrow_backward", + "skinTone": false, + "shortNames": [ + "arrow_backward" + ], + "ascii": [] + }, + { + "code": "23EA", + "name": "rewind", + "skinTone": false, + "shortNames": [ + "rewind" + ], + "ascii": [] + }, + { + "code": "23EE-FE0F", + "name": "black_left_pointing_double_triangle_with_vertical_bar", + "skinTone": false, + "shortNames": [ + "black_left_pointing_double_triangle_with_vertical_bar" + ], + "ascii": [] + }, + { + "code": "1F53C", + "name": "arrow_up_small", + "skinTone": false, + "shortNames": [ + "arrow_up_small" + ], + "ascii": [] + }, + { + "code": "23EB", + "name": "arrow_double_up", + "skinTone": false, + "shortNames": [ + "arrow_double_up" + ], + "ascii": [] + }, + { + "code": "1F53D", + "name": "arrow_down_small", + "skinTone": false, + "shortNames": [ + "arrow_down_small" + ], + "ascii": [] + }, + { + "code": "23EC", + "name": "arrow_double_down", + "skinTone": false, + "shortNames": [ + "arrow_double_down" + ], + "ascii": [] + }, + { + "code": "23F8-FE0F", + "name": "double_vertical_bar", + "skinTone": false, + "shortNames": [ + "double_vertical_bar" + ], + "ascii": [] + }, + { + "code": "23F9-FE0F", + "name": "black_square_for_stop", + "skinTone": false, + "shortNames": [ + "black_square_for_stop" + ], + "ascii": [] + }, + { + "code": "23FA-FE0F", + "name": "black_circle_for_record", + "skinTone": false, + "shortNames": [ + "black_circle_for_record" + ], + "ascii": [] + }, + { + "code": "23CF-FE0F", + "name": "eject", + "skinTone": false, + "shortNames": [ + "eject" + ], + "ascii": [] + }, + { + "code": "1F3A6", + "name": "cinema", + "skinTone": false, + "shortNames": [ + "cinema" + ], + "ascii": [] + }, + { + "code": "1F505", + "name": "low_brightness", + "skinTone": false, + "shortNames": [ + "low_brightness" + ], + "ascii": [] + }, + { + "code": "1F506", + "name": "high_brightness", + "skinTone": false, + "shortNames": [ + "high_brightness" + ], + "ascii": [] + }, + { + "code": "1F4F6", + "name": "signal_strength", + "skinTone": false, + "shortNames": [ + "signal_strength" + ], + "ascii": [] + }, + { + "code": "1F4F3", + "name": "vibration_mode", + "skinTone": false, + "shortNames": [ + "vibration_mode" + ], + "ascii": [] + }, + { + "code": "1F4F4", + "name": "mobile_phone_off", + "skinTone": false, + "shortNames": [ + "mobile_phone_off" + ], + "ascii": [] + }, + { + "code": "2640-FE0F", + "name": "female_sign", + "skinTone": false, + "shortNames": [ + "female_sign" + ], + "ascii": [] + }, + { + "code": "2642-FE0F", + "name": "male_sign", + "skinTone": false, + "shortNames": [ + "male_sign" + ], + "ascii": [] + }, + { + "code": "2695-FE0F", + "name": "staff_of_aesculapius", + "skinTone": false, + "shortNames": [ + "staff_of_aesculapius" + ], + "ascii": [] + }, + { + "code": "267B-FE0F", + "name": "recycle", + "skinTone": false, + "shortNames": [ + "recycle" + ], + "ascii": [] + }, + { + "code": "269C-FE0F", + "name": "fleur_de_lis", + "skinTone": false, + "shortNames": [ + "fleur_de_lis" + ], + "ascii": [] + }, + { + "code": "1F531", + "name": "trident", + "skinTone": false, + "shortNames": [ + "trident" + ], + "ascii": [] + }, + { + "code": "1F4DB", + "name": "name_badge", + "skinTone": false, + "shortNames": [ + "name_badge" + ], + "ascii": [] + }, + { + "code": "1F530", + "name": "beginner", + "skinTone": false, + "shortNames": [ + "beginner" + ], + "ascii": [] + }, + { + "code": "2B55", + "name": "o", + "skinTone": false, + "shortNames": [ + "o" + ], + "ascii": [] + }, + { + "code": "2705", + "name": "white_check_mark", + "skinTone": false, + "shortNames": [ + "white_check_mark" + ], + "ascii": [] + }, + { + "code": "2611-FE0F", + "name": "ballot_box_with_check", + "skinTone": false, + "shortNames": [ + "ballot_box_with_check" + ], + "ascii": [] + }, + { + "code": "2714-FE0F", + "name": "heavy_check_mark", + "skinTone": false, + "shortNames": [ + "heavy_check_mark" + ], + "ascii": [] + }, + { + "code": "2716-FE0F", + "name": "heavy_multiplication_x", + "skinTone": false, + "shortNames": [ + "heavy_multiplication_x" + ], + "ascii": [] + }, + { + "code": "274C", + "name": "x", + "skinTone": false, + "shortNames": [ + "x" + ], + "ascii": [] + }, + { + "code": "274E", + "name": "negative_squared_cross_mark", + "skinTone": false, + "shortNames": [ + "negative_squared_cross_mark" + ], + "ascii": [] + }, + { + "code": "2795", + "name": "heavy_plus_sign", + "skinTone": false, + "shortNames": [ + "heavy_plus_sign" + ], + "ascii": [] + }, + { + "code": "2796", + "name": "heavy_minus_sign", + "skinTone": false, + "shortNames": [ + "heavy_minus_sign" + ], + "ascii": [] + }, + { + "code": "2797", + "name": "heavy_division_sign", + "skinTone": false, + "shortNames": [ + "heavy_division_sign" + ], + "ascii": [] + }, + { + "code": "27B0", + "name": "curly_loop", + "skinTone": false, + "shortNames": [ + "curly_loop" + ], + "ascii": [] + }, + { + "code": "27BF", + "name": "loop", + "skinTone": false, + "shortNames": [ + "loop" + ], + "ascii": [] + }, + { + "code": "303D-FE0F", + "name": "part_alternation_mark", + "skinTone": false, + "shortNames": [ + "part_alternation_mark" + ], + "ascii": [] + }, + { + "code": "2733-FE0F", + "name": "eight_spoked_asterisk", + "skinTone": false, + "shortNames": [ + "eight_spoked_asterisk" + ], + "ascii": [] + }, + { + "code": "2734-FE0F", + "name": "eight_pointed_black_star", + "skinTone": false, + "shortNames": [ + "eight_pointed_black_star" + ], + "ascii": [] + }, + { + "code": "2747-FE0F", + "name": "sparkle", + "skinTone": false, + "shortNames": [ + "sparkle" + ], + "ascii": [] + }, + { + "code": "203C-FE0F", + "name": "bangbang", + "skinTone": false, + "shortNames": [ + "bangbang" + ], + "ascii": [] + }, + { + "code": "2049-FE0F", + "name": "interrobang", + "skinTone": false, + "shortNames": [ + "interrobang" + ], + "ascii": [] + }, + { + "code": "2753", + "name": "question", + "skinTone": false, + "shortNames": [ + "question" + ], + "ascii": [] + }, + { + "code": "2754", + "name": "grey_question", + "skinTone": false, + "shortNames": [ + "grey_question" + ], + "ascii": [] + }, + { + "code": "2755", + "name": "grey_exclamation", + "skinTone": false, + "shortNames": [ + "grey_exclamation" + ], + "ascii": [] + }, + { + "code": "2757", + "name": "exclamation", + "skinTone": false, + "shortNames": [ + "exclamation", + "heavy_exclamation_mark" + ], + "ascii": [] + }, + { + "code": "3030-FE0F", + "name": "wavy_dash", + "skinTone": false, + "shortNames": [ + "wavy_dash" + ], + "ascii": [] + }, + { + "code": "00A9-FE0F", + "name": "copyright", + "skinTone": false, + "shortNames": [ + "copyright" + ], + "ascii": [] + }, + { + "code": "00AE-FE0F", + "name": "registered", + "skinTone": false, + "shortNames": [ + "registered" + ], + "ascii": [] + }, + { + "code": "2122-FE0F", + "name": "tm", + "skinTone": false, + "shortNames": [ + "tm" + ], + "ascii": [] + }, + { + "code": "0023-FE0F-20E3", + "name": "hash", + "skinTone": false, + "shortNames": [ + "hash" + ], + "ascii": [] + }, + { + "code": "002A-FE0F-20E3", + "name": "keycap_star", + "skinTone": false, + "shortNames": [ + "keycap_star" + ], + "ascii": [] + }, + { + "code": "0030-FE0F-20E3", + "name": "zero", + "skinTone": false, + "shortNames": [ + "zero" + ], + "ascii": [] + }, + { + "code": "0031-FE0F-20E3", + "name": "one", + "skinTone": false, + "shortNames": [ + "one" + ], + "ascii": [] + }, + { + "code": "0032-FE0F-20E3", + "name": "two", + "skinTone": false, + "shortNames": [ + "two" + ], + "ascii": [] + }, + { + "code": "0033-FE0F-20E3", + "name": "three", + "skinTone": false, + "shortNames": [ + "three" + ], + "ascii": [] + }, + { + "code": "0034-FE0F-20E3", + "name": "four", + "skinTone": false, + "shortNames": [ + "four" + ], + "ascii": [] + }, + { + "code": "0035-FE0F-20E3", + "name": "five", + "skinTone": false, + "shortNames": [ + "five" + ], + "ascii": [] + }, + { + "code": "0036-FE0F-20E3", + "name": "six", + "skinTone": false, + "shortNames": [ + "six" + ], + "ascii": [] + }, + { + "code": "0037-FE0F-20E3", + "name": "seven", + "skinTone": false, + "shortNames": [ + "seven" + ], + "ascii": [] + }, + { + "code": "0038-FE0F-20E3", + "name": "eight", + "skinTone": false, + "shortNames": [ + "eight" + ], + "ascii": [] + }, + { + "code": "0039-FE0F-20E3", + "name": "nine", + "skinTone": false, + "shortNames": [ + "nine" + ], + "ascii": [] + }, + { + "code": "1F51F", + "name": "keycap_ten", + "skinTone": false, + "shortNames": [ + "keycap_ten" + ], + "ascii": [] + }, + { + "code": "1F4AF", + "name": "100", + "skinTone": false, + "shortNames": [ + "100" + ], + "ascii": [] + }, + { + "code": "1F520", + "name": "capital_abcd", + "skinTone": false, + "shortNames": [ + "capital_abcd" + ], + "ascii": [] + }, + { + "code": "1F521", + "name": "abcd", + "skinTone": false, + "shortNames": [ + "abcd" + ], + "ascii": [] + }, + { + "code": "1F522", + "name": "1234", + "skinTone": false, + "shortNames": [ + "1234" + ], + "ascii": [] + }, + { + "code": "1F523", + "name": "symbols", + "skinTone": false, + "shortNames": [ + "symbols" + ], + "ascii": [] + }, + { + "code": "1F524", + "name": "abc", + "skinTone": false, + "shortNames": [ + "abc" + ], + "ascii": [] + }, + { + "code": "1F170-FE0F", + "name": "a", + "skinTone": false, + "shortNames": [ + "a" + ], + "ascii": [] + }, + { + "code": "1F18E", + "name": "ab", + "skinTone": false, + "shortNames": [ + "ab" + ], + "ascii": [] + }, + { + "code": "1F171-FE0F", + "name": "b", + "skinTone": false, + "shortNames": [ + "b" + ], + "ascii": [] + }, + { + "code": "1F191", + "name": "cl", + "skinTone": false, + "shortNames": [ + "cl" + ], + "ascii": [] + }, + { + "code": "1F192", + "name": "cool", + "skinTone": false, + "shortNames": [ + "cool" + ], + "ascii": [] + }, + { + "code": "1F193", + "name": "free", + "skinTone": false, + "shortNames": [ + "free" + ], + "ascii": [] + }, + { + "code": "2139-FE0F", + "name": "information_source", + "skinTone": false, + "shortNames": [ + "information_source" + ], + "ascii": [] + }, + { + "code": "1F194", + "name": "id", + "skinTone": false, + "shortNames": [ + "id" + ], + "ascii": [] + }, + { + "code": "24C2-FE0F", + "name": "m", + "skinTone": false, + "shortNames": [ + "m" + ], + "ascii": [] + }, + { + "code": "1F195", + "name": "new", + "skinTone": false, + "shortNames": [ + "new" + ], + "ascii": [] + }, + { + "code": "1F196", + "name": "ng", + "skinTone": false, + "shortNames": [ + "ng" + ], + "ascii": [] + }, + { + "code": "1F17E-FE0F", + "name": "o2", + "skinTone": false, + "shortNames": [ + "o2" + ], + "ascii": [] + }, + { + "code": "1F197", + "name": "ok", + "skinTone": false, + "shortNames": [ + "ok" + ], + "ascii": [] + }, + { + "code": "1F17F-FE0F", + "name": "parking", + "skinTone": false, + "shortNames": [ + "parking" + ], + "ascii": [] + }, + { + "code": "1F198", + "name": "sos", + "skinTone": false, + "shortNames": [ + "sos" + ], + "ascii": [] + }, + { + "code": "1F199", + "name": "up", + "skinTone": false, + "shortNames": [ + "up" + ], + "ascii": [] + }, + { + "code": "1F19A", + "name": "vs", + "skinTone": false, + "shortNames": [ + "vs" + ], + "ascii": [] + }, + { + "code": "1F201", + "name": "koko", + "skinTone": false, + "shortNames": [ + "koko" + ], + "ascii": [] + }, + { + "code": "1F202-FE0F", + "name": "sa", + "skinTone": false, + "shortNames": [ + "sa" + ], + "ascii": [] + }, + { + "code": "1F237-FE0F", + "name": "u6708", + "skinTone": false, + "shortNames": [ + "u6708" + ], + "ascii": [] + }, + { + "code": "1F236-FE0F", + "name": "u6709", + "skinTone": false, + "shortNames": [ + "u6709" + ], + "ascii": [] + }, + { + "code": "1F22F", + "name": "u6307", + "skinTone": false, + "shortNames": [ + "u6307" + ], + "ascii": [] + }, + { + "code": "1F250-FE0F", + "name": "ideograph_advantage", + "skinTone": false, + "shortNames": [ + "ideograph_advantage" + ], + "ascii": [] + }, + { + "code": "1F239-FE0F", + "name": "u5272", + "skinTone": false, + "shortNames": [ + "u5272" + ], + "ascii": [] + }, + { + "code": "1F21A", + "name": "u7121", + "skinTone": false, + "shortNames": [ + "u7121" + ], + "ascii": [] + }, + { + "code": "1F232-FE0F", + "name": "u7981", + "skinTone": false, + "shortNames": [ + "u7981" + ], + "ascii": [] + }, + { + "code": "1F251-FE0F", + "name": "accept", + "skinTone": false, + "shortNames": [ + "accept" + ], + "ascii": [] + }, + { + "code": "1F238-FE0F", + "name": "u7533", + "skinTone": false, + "shortNames": [ + "u7533" + ], + "ascii": [] + }, + { + "code": "1F234-FE0F", + "name": "u5408", + "skinTone": false, + "shortNames": [ + "u5408" + ], + "ascii": [] + }, + { + "code": "1F233", + "name": "u7a7a", + "skinTone": false, + "shortNames": [ + "u7a7a" + ], + "ascii": [] + }, + { + "code": "3297-FE0F", + "name": "congratulations", + "skinTone": false, + "shortNames": [ + "congratulations" + ], + "ascii": [] + }, + { + "code": "3299-FE0F", + "name": "secret", + "skinTone": false, + "shortNames": [ + "secret" + ], + "ascii": [] + }, + { + "code": "1F23A-FE0F", + "name": "u55b6", + "skinTone": false, + "shortNames": [ + "u55b6" + ], + "ascii": [] + }, + { + "code": "1F235-FE0F", + "name": "u6e80", + "skinTone": false, + "shortNames": [ + "u6e80" + ], + "ascii": [] + }, + { + "code": "25AA-FE0F", + "name": "black_small_square", + "skinTone": false, + "shortNames": [ + "black_small_square" + ], + "ascii": [] + }, + { + "code": "25AB-FE0F", + "name": "white_small_square", + "skinTone": false, + "shortNames": [ + "white_small_square" + ], + "ascii": [] + }, + { + "code": "25FB-FE0F", + "name": "white_medium_square", + "skinTone": false, + "shortNames": [ + "white_medium_square" + ], + "ascii": [] + }, + { + "code": "25FC-FE0F", + "name": "black_medium_square", + "skinTone": false, + "shortNames": [ + "black_medium_square" + ], + "ascii": [] + }, + { + "code": "25FD", + "name": "white_medium_small_square", + "skinTone": false, + "shortNames": [ + "white_medium_small_square" + ], + "ascii": [] + }, + { + "code": "25FE", + "name": "black_medium_small_square", + "skinTone": false, + "shortNames": [ + "black_medium_small_square" + ], + "ascii": [] + }, + { + "code": "2B1B", + "name": "black_large_square", + "skinTone": false, + "shortNames": [ + "black_large_square" + ], + "ascii": [] + }, + { + "code": "2B1C", + "name": "white_large_square", + "skinTone": false, + "shortNames": [ + "white_large_square" + ], + "ascii": [] + }, + { + "code": "1F536", + "name": "large_orange_diamond", + "skinTone": false, + "shortNames": [ + "large_orange_diamond" + ], + "ascii": [] + }, + { + "code": "1F537", + "name": "large_blue_diamond", + "skinTone": false, + "shortNames": [ + "large_blue_diamond" + ], + "ascii": [] + }, + { + "code": "1F538", + "name": "small_orange_diamond", + "skinTone": false, + "shortNames": [ + "small_orange_diamond" + ], + "ascii": [] + }, + { + "code": "1F539", + "name": "small_blue_diamond", + "skinTone": false, + "shortNames": [ + "small_blue_diamond" + ], + "ascii": [] + }, + { + "code": "1F53A", + "name": "small_red_triangle", + "skinTone": false, + "shortNames": [ + "small_red_triangle" + ], + "ascii": [] + }, + { + "code": "1F53B", + "name": "small_red_triangle_down", + "skinTone": false, + "shortNames": [ + "small_red_triangle_down" + ], + "ascii": [] + }, + { + "code": "1F4A0", + "name": "diamond_shape_with_a_dot_inside", + "skinTone": false, + "shortNames": [ + "diamond_shape_with_a_dot_inside" + ], + "ascii": [] + }, + { + "code": "1F518", + "name": "radio_button", + "skinTone": false, + "shortNames": [ + "radio_button" + ], + "ascii": [] + }, + { + "code": "1F532", + "name": "black_square_button", + "skinTone": false, + "shortNames": [ + "black_square_button" + ], + "ascii": [] + }, + { + "code": "1F533", + "name": "white_square_button", + "skinTone": false, + "shortNames": [ + "white_square_button" + ], + "ascii": [] + }, + { + "code": "26AA", + "name": "white_circle", + "skinTone": false, + "shortNames": [ + "white_circle" + ], + "ascii": [] + }, + { + "code": "26AB", + "name": "black_circle", + "skinTone": false, + "shortNames": [ + "black_circle" + ], + "ascii": [] + }, + { + "code": "1F534", + "name": "red_circle", + "skinTone": false, + "shortNames": [ + "red_circle" + ], + "ascii": [] + }, + { + "code": "1F535", + "name": "large_blue_circle", + "skinTone": false, + "shortNames": [ + "large_blue_circle" + ], + "ascii": [] + } + ], + "flags": [ + { + "code": "1F3C1", + "name": "checkered_flag", + "skinTone": false, + "shortNames": [ + "checkered_flag" + ], + "ascii": [] + }, + { + "code": "1F6A9", + "name": "triangular_flag_on_post", + "skinTone": false, + "shortNames": [ + "triangular_flag_on_post" + ], + "ascii": [] + }, + { + "code": "1F3F4", + "name": "waving_black_flag", + "skinTone": false, + "shortNames": [ + "waving_black_flag" + ], + "ascii": [] + }, + { + "code": "1F3F3-FE0F", + "name": "waving_white_flag", + "skinTone": false, + "shortNames": [ + "waving_white_flag" + ], + "ascii": [] + }, + { + "code": "1F3F3-FE0F-200D-1F308", + "name": "rainbow-flag", + "skinTone": false, + "shortNames": [ + "rainbow-flag" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1EB", + "name": "flag-af", + "skinTone": false, + "shortNames": [ + "flag-af", + "afghanistan" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1FD", + "name": "flag-ax", + "skinTone": false, + "shortNames": [ + "flag-ax", + "\u00c5land_islands" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1F1", + "name": "flag-al", + "skinTone": false, + "shortNames": [ + "flag-al", + "albania" + ], + "ascii": [] + }, + { + "code": "1F1E9-1F1FF", + "name": "flag-dz", + "skinTone": false, + "shortNames": [ + "flag-dz", + "algeria" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1F8", + "name": "flag-as", + "skinTone": false, + "shortNames": [ + "flag-as", + "american_samoa" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1E9", + "name": "flag-ad", + "skinTone": false, + "shortNames": [ + "flag-ad", + "andorra" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1F4", + "name": "flag-ao", + "skinTone": false, + "shortNames": [ + "flag-ao", + "angola" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1EE", + "name": "flag-ai", + "skinTone": false, + "shortNames": [ + "flag-ai", + "anguilla" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1F6", + "name": "flag-aq", + "skinTone": false, + "shortNames": [ + "flag-aq", + "antarctica" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1EC", + "name": "flag-ag", + "skinTone": false, + "shortNames": [ + "flag-ag", + "antigua_and_barbuda" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1F7", + "name": "flag-ar", + "skinTone": false, + "shortNames": [ + "flag-ar", + "argentina" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1F2", + "name": "flag-am", + "skinTone": false, + "shortNames": [ + "flag-am", + "armenia" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1FC", + "name": "flag-aw", + "skinTone": false, + "shortNames": [ + "flag-aw", + "aruba" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1FA", + "name": "flag-au", + "skinTone": false, + "shortNames": [ + "flag-au", + "australia" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1F9", + "name": "flag-at", + "skinTone": false, + "shortNames": [ + "flag-at", + "austria" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1FF", + "name": "flag-az", + "skinTone": false, + "shortNames": [ + "flag-az", + "azerbaijan" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1F8", + "name": "flag-bs", + "skinTone": false, + "shortNames": [ + "flag-bs", + "bahamas" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1ED", + "name": "flag-bh", + "skinTone": false, + "shortNames": [ + "flag-bh", + "bahrain" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1E9", + "name": "flag-bd", + "skinTone": false, + "shortNames": [ + "flag-bd", + "bangladesh" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1E7", + "name": "flag-bb", + "skinTone": false, + "shortNames": [ + "flag-bb", + "barbados" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1FE", + "name": "flag-by", + "skinTone": false, + "shortNames": [ + "flag-by", + "belarus" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1EA", + "name": "flag-be", + "skinTone": false, + "shortNames": [ + "flag-be", + "belgium" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1FF", + "name": "flag-bz", + "skinTone": false, + "shortNames": [ + "flag-bz", + "belize" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1EF", + "name": "flag-bj", + "skinTone": false, + "shortNames": [ + "flag-bj", + "benin" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1F2", + "name": "flag-bm", + "skinTone": false, + "shortNames": [ + "flag-bm", + "bermuda" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1F9", + "name": "flag-bt", + "skinTone": false, + "shortNames": [ + "flag-bt", + "bhutan" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1F4", + "name": "flag-bo", + "skinTone": false, + "shortNames": [ + "flag-bo", + "bolivia" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1E6", + "name": "flag-ba", + "skinTone": false, + "shortNames": [ + "flag-ba", + "bosnia_and_herzegovina" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1FC", + "name": "flag-bw", + "skinTone": false, + "shortNames": [ + "flag-bw", + "botswana" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1F7", + "name": "flag-br", + "skinTone": false, + "shortNames": [ + "flag-br", + "brazil" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1F4", + "name": "flag-io", + "skinTone": false, + "shortNames": [ + "flag-io", + "british_indian_ocean_territory" + ], + "ascii": [] + }, + { + "code": "1F1FB-1F1EC", + "name": "flag-vg", + "skinTone": false, + "shortNames": [ + "flag-vg", + "british_virgin_islands" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1F3", + "name": "flag-bn", + "skinTone": false, + "shortNames": [ + "flag-bn", + "brunei_darussalam" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1EC", + "name": "flag-bg", + "skinTone": false, + "shortNames": [ + "flag-bg", + "bulgaria" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1EB", + "name": "flag-bf", + "skinTone": false, + "shortNames": [ + "flag-bf", + "burkina_faso" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1EE", + "name": "flag-bi", + "skinTone": false, + "shortNames": [ + "flag-bi", + "burundi" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1ED", + "name": "flag-kh", + "skinTone": false, + "shortNames": [ + "flag-kh", + "cambodia" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1F2", + "name": "flag-cm", + "skinTone": false, + "shortNames": [ + "flag-cm", + "cameroon" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1E6", + "name": "flag-ca", + "skinTone": false, + "shortNames": [ + "flag-ca", + "canada" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1E8", + "name": "flag-ic", + "skinTone": false, + "shortNames": [ + "flag-ic", + "canary_islands" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1FB", + "name": "flag-cv", + "skinTone": false, + "shortNames": [ + "flag-cv", + "cape_verde" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1F6", + "name": "flag-bq", + "skinTone": false, + "shortNames": [ + "flag-bq", + "caribbean_netherlands" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1FE", + "name": "flag-ky", + "skinTone": false, + "shortNames": [ + "flag-ky", + "cayman_islands" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1EB", + "name": "flag-cf", + "skinTone": false, + "shortNames": [ + "flag-cf", + "central_african_republic" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1E9", + "name": "flag-td", + "skinTone": false, + "shortNames": [ + "flag-td", + "chad" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1F1", + "name": "flag-cl", + "skinTone": false, + "shortNames": [ + "flag-cl", + "chile" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1F3", + "name": "flag-cn", + "skinTone": false, + "shortNames": [ + "cn", + "flag-cn", + "china" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1FD", + "name": "flag-cx", + "skinTone": false, + "shortNames": [ + "flag-cx", + "christmas_island" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1E8", + "name": "flag-cc", + "skinTone": false, + "shortNames": [ + "flag-cc", + "cocos_keeling_islands" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1F4", + "name": "flag-co", + "skinTone": false, + "shortNames": [ + "flag-co", + "colombia" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1F2", + "name": "flag-km", + "skinTone": false, + "shortNames": [ + "flag-km", + "comoros" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1EC", + "name": "flag-cg", + "skinTone": false, + "shortNames": [ + "flag-cg", + "congo_-_brazzaville" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1E9", + "name": "flag-cd", + "skinTone": false, + "shortNames": [ + "flag-cd", + "congo_-_kinshasa" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1F0", + "name": "flag-ck", + "skinTone": false, + "shortNames": [ + "flag-ck", + "cook_islands" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1F7", + "name": "flag-cr", + "skinTone": false, + "shortNames": [ + "flag-cr", + "costa_rica" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1EE", + "name": "flag-ci", + "skinTone": false, + "shortNames": [ + "flag-ci", + "c\u00f4te_d\u2019ivoire" + ], + "ascii": [] + }, + { + "code": "1F1ED-1F1F7", + "name": "flag-hr", + "skinTone": false, + "shortNames": [ + "flag-hr", + "croatia" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1FA", + "name": "flag-cu", + "skinTone": false, + "shortNames": [ + "flag-cu", + "cuba" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1FC", + "name": "flag-cw", + "skinTone": false, + "shortNames": [ + "flag-cw", + "cura\u00e7ao" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1FE", + "name": "flag-cy", + "skinTone": false, + "shortNames": [ + "flag-cy", + "cyprus" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1FF", + "name": "flag-cz", + "skinTone": false, + "shortNames": [ + "flag-cz", + "czech_republic" + ], + "ascii": [] + }, + { + "code": "1F1E9-1F1F0", + "name": "flag-dk", + "skinTone": false, + "shortNames": [ + "flag-dk", + "denmark" + ], + "ascii": [] + }, + { + "code": "1F1E9-1F1EF", + "name": "flag-dj", + "skinTone": false, + "shortNames": [ + "flag-dj", + "djibouti" + ], + "ascii": [] + }, + { + "code": "1F1E9-1F1F2", + "name": "flag-dm", + "skinTone": false, + "shortNames": [ + "flag-dm", + "dominica" + ], + "ascii": [] + }, + { + "code": "1F1E9-1F1F4", + "name": "flag-do", + "skinTone": false, + "shortNames": [ + "flag-do", + "dominican_republic" + ], + "ascii": [] + }, + { + "code": "1F1EA-1F1E8", + "name": "flag-ec", + "skinTone": false, + "shortNames": [ + "flag-ec", + "ecuador" + ], + "ascii": [] + }, + { + "code": "1F1EA-1F1EC", + "name": "flag-eg", + "skinTone": false, + "shortNames": [ + "flag-eg", + "egypt" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1FB", + "name": "flag-sv", + "skinTone": false, + "shortNames": [ + "flag-sv", + "el_salvador" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1F6", + "name": "flag-gq", + "skinTone": false, + "shortNames": [ + "flag-gq", + "equatorial_guinea" + ], + "ascii": [] + }, + { + "code": "1F1EA-1F1F7", + "name": "flag-er", + "skinTone": false, + "shortNames": [ + "flag-er", + "eritrea" + ], + "ascii": [] + }, + { + "code": "1F1EA-1F1EA", + "name": "flag-ee", + "skinTone": false, + "shortNames": [ + "flag-ee", + "estonia" + ], + "ascii": [] + }, + { + "code": "1F1EA-1F1F9", + "name": "flag-et", + "skinTone": false, + "shortNames": [ + "flag-et", + "ethiopia" + ], + "ascii": [] + }, + { + "code": "1F1EA-1F1FA", + "name": "flag-eu", + "skinTone": false, + "shortNames": [ + "flag-eu", + "european_union" + ], + "ascii": [] + }, + { + "code": "1F1EB-1F1F0", + "name": "flag-fk", + "skinTone": false, + "shortNames": [ + "flag-fk", + "falkland_islands_malvinas" + ], + "ascii": [] + }, + { + "code": "1F1EB-1F1F4", + "name": "flag-fo", + "skinTone": false, + "shortNames": [ + "flag-fo", + "faroe_islands" + ], + "ascii": [] + }, + { + "code": "1F1EB-1F1EF", + "name": "flag-fj", + "skinTone": false, + "shortNames": [ + "flag-fj", + "fiji" + ], + "ascii": [] + }, + { + "code": "1F1EB-1F1EE", + "name": "flag-fi", + "skinTone": false, + "shortNames": [ + "flag-fi", + "finland" + ], + "ascii": [] + }, + { + "code": "1F1EB-1F1F7", + "name": "flag-fr", + "skinTone": false, + "shortNames": [ + "fr", + "flag-fr", + "france" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1EB", + "name": "flag-gf", + "skinTone": false, + "shortNames": [ + "flag-gf", + "french_guiana" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1EB", + "name": "flag-pf", + "skinTone": false, + "shortNames": [ + "flag-pf", + "french_polynesia" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1EB", + "name": "flag-tf", + "skinTone": false, + "shortNames": [ + "flag-tf", + "french_southern_territories" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1E6", + "name": "flag-ga", + "skinTone": false, + "shortNames": [ + "flag-ga", + "gabon" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1F2", + "name": "flag-gm", + "skinTone": false, + "shortNames": [ + "flag-gm", + "gambia" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1EA", + "name": "flag-ge", + "skinTone": false, + "shortNames": [ + "flag-ge", + "georgia" + ], + "ascii": [] + }, + { + "code": "1F1E9-1F1EA", + "name": "flag-de", + "skinTone": false, + "shortNames": [ + "de", + "flag-de", + "germany" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1ED", + "name": "flag-gh", + "skinTone": false, + "shortNames": [ + "flag-gh", + "ghana" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1EE", + "name": "flag-gi", + "skinTone": false, + "shortNames": [ + "flag-gi", + "gibraltar" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1F7", + "name": "flag-gr", + "skinTone": false, + "shortNames": [ + "flag-gr", + "greece" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1F1", + "name": "flag-gl", + "skinTone": false, + "shortNames": [ + "flag-gl", + "greenland" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1E9", + "name": "flag-gd", + "skinTone": false, + "shortNames": [ + "flag-gd", + "grenada" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1F5", + "name": "flag-gp", + "skinTone": false, + "shortNames": [ + "flag-gp", + "guadeloupe" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1FA", + "name": "flag-gu", + "skinTone": false, + "shortNames": [ + "flag-gu", + "guam" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1F9", + "name": "flag-gt", + "skinTone": false, + "shortNames": [ + "flag-gt", + "guatemala" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1EC", + "name": "flag-gg", + "skinTone": false, + "shortNames": [ + "flag-gg", + "guernsey" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1F3", + "name": "flag-gn", + "skinTone": false, + "shortNames": [ + "flag-gn", + "guinea" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1FC", + "name": "flag-gw", + "skinTone": false, + "shortNames": [ + "flag-gw", + "guinea-bissau" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1FE", + "name": "flag-gy", + "skinTone": false, + "shortNames": [ + "flag-gy", + "guyana" + ], + "ascii": [] + }, + { + "code": "1F1ED-1F1F9", + "name": "flag-ht", + "skinTone": false, + "shortNames": [ + "flag-ht", + "haiti" + ], + "ascii": [] + }, + { + "code": "1F1ED-1F1F3", + "name": "flag-hn", + "skinTone": false, + "shortNames": [ + "flag-hn", + "honduras" + ], + "ascii": [] + }, + { + "code": "1F1ED-1F1F0", + "name": "flag-hk", + "skinTone": false, + "shortNames": [ + "flag-hk", + "hong_kong" + ], + "ascii": [] + }, + { + "code": "1F1ED-1F1FA", + "name": "flag-hu", + "skinTone": false, + "shortNames": [ + "flag-hu", + "hungary" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1F8", + "name": "flag-is", + "skinTone": false, + "shortNames": [ + "flag-is", + "iceland" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1F3", + "name": "flag-in", + "skinTone": false, + "shortNames": [ + "flag-in", + "india" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1E9", + "name": "flag-id", + "skinTone": false, + "shortNames": [ + "flag-id", + "indonesia" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1F7", + "name": "flag-ir", + "skinTone": false, + "shortNames": [ + "flag-ir", + "iran" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1F6", + "name": "flag-iq", + "skinTone": false, + "shortNames": [ + "flag-iq", + "iraq" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1EA", + "name": "flag-ie", + "skinTone": false, + "shortNames": [ + "flag-ie", + "ireland" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1F2", + "name": "flag-im", + "skinTone": false, + "shortNames": [ + "flag-im", + "isle_of_man" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1F1", + "name": "flag-il", + "skinTone": false, + "shortNames": [ + "flag-il", + "israel" + ], + "ascii": [] + }, + { + "code": "1F1EE-1F1F9", + "name": "flag-it", + "skinTone": false, + "shortNames": [ + "it", + "flag-it", + "italy" + ], + "ascii": [] + }, + { + "code": "1F1EF-1F1F2", + "name": "flag-jm", + "skinTone": false, + "shortNames": [ + "flag-jm", + "jamaica" + ], + "ascii": [] + }, + { + "code": "1F1EF-1F1F5", + "name": "flag-jp", + "skinTone": false, + "shortNames": [ + "jp", + "flag-jp", + "japan" + ], + "ascii": [] + }, + { + "code": "1F1EF-1F1EA", + "name": "flag-je", + "skinTone": false, + "shortNames": [ + "flag-je", + "jersey" + ], + "ascii": [] + }, + { + "code": "1F1EF-1F1F4", + "name": "flag-jo", + "skinTone": false, + "shortNames": [ + "flag-jo", + "jordan" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1FF", + "name": "flag-kz", + "skinTone": false, + "shortNames": [ + "flag-kz", + "kazakhstan" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1EA", + "name": "flag-ke", + "skinTone": false, + "shortNames": [ + "flag-ke", + "kenya" + ], + "ascii": [] + }, + { + "code": "1F38C", + "name": "crossed_flags", + "skinTone": false, + "shortNames": [ + "crossed_flags" + ], + "ascii": [] + }, + { + "code": "1F1FD-1F1F0", + "name": "flag-xk", + "skinTone": false, + "shortNames": [ + "flag-xk", + "kosovo" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1FC", + "name": "flag-kw", + "skinTone": false, + "shortNames": [ + "flag-kw", + "kuwait" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1EC", + "name": "flag-kg", + "skinTone": false, + "shortNames": [ + "flag-kg", + "kyrgyzstan" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1E6", + "name": "flag-la", + "skinTone": false, + "shortNames": [ + "flag-la", + "lao_people's_democratic_republic" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1FB", + "name": "flag-lv", + "skinTone": false, + "shortNames": [ + "flag-lv", + "latvia" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1E7", + "name": "flag-lb", + "skinTone": false, + "shortNames": [ + "flag-lb", + "lebanon" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1F8", + "name": "flag-ls", + "skinTone": false, + "shortNames": [ + "flag-ls", + "lesotho" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1F7", + "name": "flag-lr", + "skinTone": false, + "shortNames": [ + "flag-lr", + "liberia" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1FE", + "name": "flag-ly", + "skinTone": false, + "shortNames": [ + "flag-ly", + "libya" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1EE", + "name": "flag-li", + "skinTone": false, + "shortNames": [ + "flag-li", + "liechtenstein" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1F9", + "name": "flag-lt", + "skinTone": false, + "shortNames": [ + "flag-lt", + "lithuania" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1FA", + "name": "flag-lu", + "skinTone": false, + "shortNames": [ + "flag-lu", + "luxembourg" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F4", + "name": "flag-mo", + "skinTone": false, + "shortNames": [ + "flag-mo", + "macao" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F0", + "name": "flag-mk", + "skinTone": false, + "shortNames": [ + "flag-mk", + "macedonia" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1EC", + "name": "flag-mg", + "skinTone": false, + "shortNames": [ + "flag-mg", + "madagascar" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1FC", + "name": "flag-mw", + "skinTone": false, + "shortNames": [ + "flag-mw", + "malawi" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1FE", + "name": "flag-my", + "skinTone": false, + "shortNames": [ + "flag-my", + "malaysia" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1FB", + "name": "flag-mv", + "skinTone": false, + "shortNames": [ + "flag-mv", + "maldives" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F1", + "name": "flag-ml", + "skinTone": false, + "shortNames": [ + "flag-ml", + "mali" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F9", + "name": "flag-mt", + "skinTone": false, + "shortNames": [ + "flag-mt", + "malta" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1ED", + "name": "flag-mh", + "skinTone": false, + "shortNames": [ + "flag-mh", + "marshall_islands" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F6", + "name": "flag-mq", + "skinTone": false, + "shortNames": [ + "flag-mq", + "martinique" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F7", + "name": "flag-mr", + "skinTone": false, + "shortNames": [ + "flag-mr", + "mauritania" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1FA", + "name": "flag-mu", + "skinTone": false, + "shortNames": [ + "flag-mu", + "mauritius" + ], + "ascii": [] + }, + { + "code": "1F1FE-1F1F9", + "name": "flag-yt", + "skinTone": false, + "shortNames": [ + "flag-yt", + "mayotte" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1FD", + "name": "flag-mx", + "skinTone": false, + "shortNames": [ + "flag-mx", + "mexico" + ], + "ascii": [] + }, + { + "code": "1F1EB-1F1F2", + "name": "flag-fm", + "skinTone": false, + "shortNames": [ + "flag-fm", + "micronesia" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1E9", + "name": "flag-md", + "skinTone": false, + "shortNames": [ + "flag-md", + "moldova" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1E8", + "name": "flag-mc", + "skinTone": false, + "shortNames": [ + "flag-mc", + "monaco" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F3", + "name": "flag-mn", + "skinTone": false, + "shortNames": [ + "flag-mn", + "mongolia" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1EA", + "name": "flag-me", + "skinTone": false, + "shortNames": [ + "flag-me", + "montenegro" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F8", + "name": "flag-ms", + "skinTone": false, + "shortNames": [ + "flag-ms", + "montserrat" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1E6", + "name": "flag-ma", + "skinTone": false, + "shortNames": [ + "flag-ma", + "morocco" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1FF", + "name": "flag-mz", + "skinTone": false, + "shortNames": [ + "flag-mz", + "mozambique" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F2", + "name": "flag-mm", + "skinTone": false, + "shortNames": [ + "flag-mm", + "myanmar" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1E6", + "name": "flag-na", + "skinTone": false, + "shortNames": [ + "flag-na", + "namibia" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1F7", + "name": "flag-nr", + "skinTone": false, + "shortNames": [ + "flag-nr", + "nauru" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1F5", + "name": "flag-np", + "skinTone": false, + "shortNames": [ + "flag-np", + "nepal" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1F1", + "name": "flag-nl", + "skinTone": false, + "shortNames": [ + "flag-nl", + "netherlands" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1E8", + "name": "flag-nc", + "skinTone": false, + "shortNames": [ + "flag-nc", + "new_caledonia" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1FF", + "name": "flag-nz", + "skinTone": false, + "shortNames": [ + "flag-nz", + "new_zealand" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1EE", + "name": "flag-ni", + "skinTone": false, + "shortNames": [ + "flag-ni", + "nicaragua" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1EA", + "name": "flag-ne", + "skinTone": false, + "shortNames": [ + "flag-ne", + "niger" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1EC", + "name": "flag-ng", + "skinTone": false, + "shortNames": [ + "flag-ng", + "nigeria" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1FA", + "name": "flag-nu", + "skinTone": false, + "shortNames": [ + "flag-nu", + "niue" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1EB", + "name": "flag-nf", + "skinTone": false, + "shortNames": [ + "flag-nf", + "norfolk_island" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1F5", + "name": "flag-kp", + "skinTone": false, + "shortNames": [ + "flag-kp", + "north_korea" + ], + "ascii": [] + }, + { + "code": "1F1F2-1F1F5", + "name": "flag-mp", + "skinTone": false, + "shortNames": [ + "flag-mp", + "northern_mariana_islands" + ], + "ascii": [] + }, + { + "code": "1F1F3-1F1F4", + "name": "flag-no", + "skinTone": false, + "shortNames": [ + "flag-no", + "norway" + ], + "ascii": [] + }, + { + "code": "1F1F4-1F1F2", + "name": "flag-om", + "skinTone": false, + "shortNames": [ + "flag-om", + "oman" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1F0", + "name": "flag-pk", + "skinTone": false, + "shortNames": [ + "flag-pk", + "pakistan" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1FC", + "name": "flag-pw", + "skinTone": false, + "shortNames": [ + "flag-pw", + "palau" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1F8", + "name": "flag-ps", + "skinTone": false, + "shortNames": [ + "flag-ps", + "palestinian_territories" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1E6", + "name": "flag-pa", + "skinTone": false, + "shortNames": [ + "flag-pa", + "panama" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1EC", + "name": "flag-pg", + "skinTone": false, + "shortNames": [ + "flag-pg", + "papua_new_guinea" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1FE", + "name": "flag-py", + "skinTone": false, + "shortNames": [ + "flag-py", + "paraguay" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1EA", + "name": "flag-pe", + "skinTone": false, + "shortNames": [ + "flag-pe", + "peru" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1ED", + "name": "flag-ph", + "skinTone": false, + "shortNames": [ + "flag-ph", + "philippines" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1F3", + "name": "flag-pn", + "skinTone": false, + "shortNames": [ + "flag-pn", + "pitcairn" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1F1", + "name": "flag-pl", + "skinTone": false, + "shortNames": [ + "flag-pl", + "poland" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1F9", + "name": "flag-pt", + "skinTone": false, + "shortNames": [ + "flag-pt", + "portugal" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1F7", + "name": "flag-pr", + "skinTone": false, + "shortNames": [ + "flag-pr", + "puerto_rico" + ], + "ascii": [] + }, + { + "code": "1F1F6-1F1E6", + "name": "flag-qa", + "skinTone": false, + "shortNames": [ + "flag-qa", + "qatar" + ], + "ascii": [] + }, + { + "code": "1F1F7-1F1EA", + "name": "flag-re", + "skinTone": false, + "shortNames": [ + "flag-re", + "r\u00e9union" + ], + "ascii": [] + }, + { + "code": "1F1F7-1F1F4", + "name": "flag-ro", + "skinTone": false, + "shortNames": [ + "flag-ro", + "romania" + ], + "ascii": [] + }, + { + "code": "1F1F7-1F1FA", + "name": "flag-ru", + "skinTone": false, + "shortNames": [ + "ru", + "flag-ru", + "russian_federation" + ], + "ascii": [] + }, + { + "code": "1F1F7-1F1FC", + "name": "flag-rw", + "skinTone": false, + "shortNames": [ + "flag-rw", + "rwanda" + ], + "ascii": [] + }, + { + "code": "1F1FC-1F1F8", + "name": "flag-ws", + "skinTone": false, + "shortNames": [ + "flag-ws", + "samoa" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1F2", + "name": "flag-sm", + "skinTone": false, + "shortNames": [ + "flag-sm", + "san_marino" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1F9", + "name": "flag-st", + "skinTone": false, + "shortNames": [ + "flag-st", + "sao_tome_and_principe" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1E6", + "name": "flag-sa", + "skinTone": false, + "shortNames": [ + "flag-sa", + "saudi_arabia" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1F3", + "name": "flag-sn", + "skinTone": false, + "shortNames": [ + "flag-sn", + "senegal" + ], + "ascii": [] + }, + { + "code": "1F1F7-1F1F8", + "name": "flag-rs", + "skinTone": false, + "shortNames": [ + "flag-rs", + "serbia" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1E8", + "name": "flag-sc", + "skinTone": false, + "shortNames": [ + "flag-sc", + "seychelles" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1F1", + "name": "flag-sl", + "skinTone": false, + "shortNames": [ + "flag-sl", + "sierra_leone" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1EC", + "name": "flag-sg", + "skinTone": false, + "shortNames": [ + "flag-sg", + "singapore" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1FD", + "name": "flag-sx", + "skinTone": false, + "shortNames": [ + "flag-sx", + "sint_maarten" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1F0", + "name": "flag-sk", + "skinTone": false, + "shortNames": [ + "flag-sk", + "slovakia" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1EE", + "name": "flag-si", + "skinTone": false, + "shortNames": [ + "flag-si", + "slovenia" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1F8", + "name": "flag-gs", + "skinTone": false, + "shortNames": [ + "flag-gs", + "south_georgia_and_the_south_sandwich_islands" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1E7", + "name": "flag-sb", + "skinTone": false, + "shortNames": [ + "flag-sb", + "solomon_islands" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1F4", + "name": "flag-so", + "skinTone": false, + "shortNames": [ + "flag-so", + "somalia" + ], + "ascii": [] + }, + { + "code": "1F1FF-1F1E6", + "name": "flag-za", + "skinTone": false, + "shortNames": [ + "flag-za", + "south_africa" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1F7", + "name": "flag-kr", + "skinTone": false, + "shortNames": [ + "kr", + "flag-kr", + "south_korea" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1F8", + "name": "flag-ss", + "skinTone": false, + "shortNames": [ + "flag-ss", + "south_sudan" + ], + "ascii": [] + }, + { + "code": "1F1EA-1F1F8", + "name": "flag-es", + "skinTone": false, + "shortNames": [ + "es", + "flag-es", + "spain" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1F0", + "name": "flag-lk", + "skinTone": false, + "shortNames": [ + "flag-lk", + "sri_lanka" + ], + "ascii": [] + }, + { + "code": "1F1E7-1F1F1", + "name": "flag-bl", + "skinTone": false, + "shortNames": [ + "flag-bl", + "saint_barth\u00e9lemy" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1ED", + "name": "flag-sh", + "skinTone": false, + "shortNames": [ + "flag-sh", + "saint_helena" + ], + "ascii": [] + }, + { + "code": "1F1F0-1F1F3", + "name": "flag-kn", + "skinTone": false, + "shortNames": [ + "flag-kn", + "saint_kitts_and_nevis" + ], + "ascii": [] + }, + { + "code": "1F1F1-1F1E8", + "name": "flag-lc", + "skinTone": false, + "shortNames": [ + "flag-lc", + "saint_lucia" + ], + "ascii": [] + }, + { + "code": "1F1F5-1F1F2", + "name": "flag-pm", + "skinTone": false, + "shortNames": [ + "flag-pm", + "saint_pierre_and_miquelon" + ], + "ascii": [] + }, + { + "code": "1F1FB-1F1E8", + "name": "flag-vc", + "skinTone": false, + "shortNames": [ + "flag-vc", + "saint_vincent_and_the_grenadines" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1E9", + "name": "flag-sd", + "skinTone": false, + "shortNames": [ + "flag-sd", + "sudan" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1F7", + "name": "flag-sr", + "skinTone": false, + "shortNames": [ + "flag-sr", + "suriname" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1FF", + "name": "flag-sz", + "skinTone": false, + "shortNames": [ + "flag-sz", + "swaziland" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1EA", + "name": "flag-se", + "skinTone": false, + "shortNames": [ + "flag-se", + "sweden" + ], + "ascii": [] + }, + { + "code": "1F1E8-1F1ED", + "name": "flag-ch", + "skinTone": false, + "shortNames": [ + "flag-ch", + "switzerland" + ], + "ascii": [] + }, + { + "code": "1F1F8-1F1FE", + "name": "flag-sy", + "skinTone": false, + "shortNames": [ + "flag-sy", + "syrian_arab_republic" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1FC", + "name": "flag-tw", + "skinTone": false, + "shortNames": [ + "flag-tw", + "taiwan" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1EF", + "name": "flag-tj", + "skinTone": false, + "shortNames": [ + "flag-tj", + "tajikistan" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1FF", + "name": "flag-tz", + "skinTone": false, + "shortNames": [ + "flag-tz", + "tanzania" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1ED", + "name": "flag-th", + "skinTone": false, + "shortNames": [ + "flag-th", + "thailand" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1F1", + "name": "flag-tl", + "skinTone": false, + "shortNames": [ + "flag-tl", + "timor-leste" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1EC", + "name": "flag-tg", + "skinTone": false, + "shortNames": [ + "flag-tg", + "togo" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1F0", + "name": "flag-tk", + "skinTone": false, + "shortNames": [ + "flag-tk", + "tokelau" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1F4", + "name": "flag-to", + "skinTone": false, + "shortNames": [ + "flag-to", + "tonga" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1F9", + "name": "flag-tt", + "skinTone": false, + "shortNames": [ + "flag-tt", + "trinidad_and_tobago" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1F3", + "name": "flag-tn", + "skinTone": false, + "shortNames": [ + "flag-tn", + "tunisia" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1F7", + "name": "flag-tr", + "skinTone": false, + "shortNames": [ + "flag-tr", + "turkey" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1F2", + "name": "flag-tm", + "skinTone": false, + "shortNames": [ + "flag-tm", + "turkmenistan" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1E8", + "name": "flag-tc", + "skinTone": false, + "shortNames": [ + "flag-tc", + "turks_and_caicos_islands" + ], + "ascii": [] + }, + { + "code": "1F1F9-1F1FB", + "name": "flag-tv", + "skinTone": false, + "shortNames": [ + "flag-tv", + "tuvalu" + ], + "ascii": [] + }, + { + "code": "1F1FB-1F1EE", + "name": "flag-vi", + "skinTone": false, + "shortNames": [ + "flag-vi", + "u.s._virgin_islands" + ], + "ascii": [] + }, + { + "code": "1F1FA-1F1EC", + "name": "flag-ug", + "skinTone": false, + "shortNames": [ + "flag-ug", + "uganda" + ], + "ascii": [] + }, + { + "code": "1F1FA-1F1E6", + "name": "flag-ua", + "skinTone": false, + "shortNames": [ + "flag-ua", + "ukraine" + ], + "ascii": [] + }, + { + "code": "1F1E6-1F1EA", + "name": "flag-ae", + "skinTone": false, + "shortNames": [ + "flag-ae", + "united_arab_emirates" + ], + "ascii": [] + }, + { + "code": "1F1EC-1F1E7", + "name": "flag-gb", + "skinTone": false, + "shortNames": [ + "gb", + "uk", + "flag-gb", + "united_kingdom" + ], + "ascii": [] + }, + { + "code": "1F3F4-E0067-E0062-E0065-E006E-E0067-E007F", + "name": "flag-england", + "skinTone": false, + "shortNames": [ + "flag-england", + "england" + ], + "ascii": [] + }, + { + "code": "1F3F4-E0067-E0062-E0073-E0063-E0074-E007F", + "name": "flag-scotland", + "skinTone": false, + "shortNames": [ + "flag-scotland", + "scotland" + ], + "ascii": [] + }, + { + "code": "1F3F4-E0067-E0062-E0077-E006C-E0073-E007F", + "name": "flag-wales", + "skinTone": false, + "shortNames": [ + "flag-wales", + "wales" + ], + "ascii": [] + }, + { + "code": "1F1FA-1F1F8", + "name": "flag-us", + "skinTone": false, + "shortNames": [ + "us", + "flag-us", + "united_states" + ], + "ascii": [] + }, + { + "code": "1F1FA-1F1FE", + "name": "flag-uy", + "skinTone": false, + "shortNames": [ + "flag-uy", + "uruguay" + ], + "ascii": [] + }, + { + "code": "1F1FA-1F1FF", + "name": "flag-uz", + "skinTone": false, + "shortNames": [ + "flag-uz", + "uzbekistan" + ], + "ascii": [] + }, + { + "code": "1F1FB-1F1FA", + "name": "flag-vu", + "skinTone": false, + "shortNames": [ + "flag-vu", + "vanuatu" + ], + "ascii": [] + }, + { + "code": "1F1FB-1F1E6", + "name": "flag-va", + "skinTone": false, + "shortNames": [ + "flag-va", + "holy_see" + ], + "ascii": [] + }, + { + "code": "1F1FB-1F1EA", + "name": "flag-ve", + "skinTone": false, + "shortNames": [ + "flag-ve", + "venezuela" + ], + "ascii": [] + }, + { + "code": "1F1FB-1F1F3", + "name": "flag-vn", + "skinTone": false, + "shortNames": [ + "flag-vn", + "vietnam" + ], + "ascii": [] + }, + { + "code": "1F1FC-1F1EB", + "name": "flag-wf", + "skinTone": false, + "shortNames": [ + "flag-wf", + "wallis_and_futuna" + ], + "ascii": [] + }, + { + "code": "1F1EA-1F1ED", + "name": "flag-eh", + "skinTone": false, + "shortNames": [ + "flag-eh", + "western_sahara" + ], + "ascii": [] + }, + { + "code": "1F1FE-1F1EA", + "name": "flag-ye", + "skinTone": false, + "shortNames": [ + "flag-ye", + "yemen" + ], + "ascii": [] + }, + { + "code": "1F1FF-1F1F2", + "name": "flag-zm", + "skinTone": false, + "shortNames": [ + "flag-zm", + "zambia" + ], + "ascii": [] + }, + { + "code": "1F1FF-1F1FC", + "name": "flag-zw", + "skinTone": false, + "shortNames": [ + "flag-zw", + "zimbabwe" + ], + "ascii": [] + }, + { + "code": "1F1FA-1F1F3", + "name": "flag-un", + "skinTone": false, + "shortNames": [ + "flag-un", + "united_nations" + ], + "ascii": [] + } + ] +} \ No newline at end of file diff --git a/applications/core/data/furl.json b/applications/core/data/furl.json index 58803309..ab380618 100644 --- a/applications/core/data/furl.json +++ b/applications/core/data/furl.json @@ -75,26 +75,14 @@ "settings_signature": { "friendly": "settings/signature", "real": "app=core&module=system&controller=settings&area=signature" - }, - "settings_Facebook": { - "friendly": "settings/facebook", - "real": "app=core&module=system&controller=settings&area=profilesync&service=Facebook" - }, - "settings_Google": { - "friendly": "settings/google", - "real": "app=core&module=system&controller=settings&area=profilesync&service=Google" - }, - "settings_Linkedin": { - "friendly": "settings/linkedin", - "real": "app=core&module=system&controller=settings&area=profilesync&service=LinkedIn" - }, - "settings_Microsoft": { - "friendly": "settings/microsoft", - "real": "app=core&module=system&controller=settings&area=profilesync&service=Microsoft" - }, - "settings_Twitter": { - "friendly": "settings/twitter", - "real": "app=core&module=system&controller=settings&area=profilesync&service=Twitter" + }, + "settings_login": { + "friendly": "settings/login", + "real": "app=core&module=system&controller=settings&area=login" + }, + "settings_apps": { + "friendly": "settings/apps", + "real": "app=core&module=system&controller=settings&area=apps" }, "settings": { "friendly": "settings", @@ -117,6 +105,11 @@ "friendly": "attachments", "real": "app=core&module=system&controller=attachments" }, + "cookies": { + "friendly": "cookies", + "real": "app=core&module=system&controller=cookies", + "alias": "cookies" + }, /* Messenger */ "messenger_compose": { diff --git a/applications/core/data/javascript.xml b/applications/core/data/javascript.xml index 79d78099..69aae046 100644 --- a/applications/core/data/javascript.xml +++ b/applications/core/data/javascript.xml @@ -1,6 +1,6 @@ - - - - - - - /* global ips, _, Debug */ + /* global ips, _, Debug */ /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com @@ -2355,7 +2377,7 @@ var Debug = Debug || {}; }; }(jQuery, _)); - - - '); + var id = container.identify().attr('id'); + elem.append( container ); + + var form = elem.closest('form'); + var recaptchaId = grecaptcha.render( id, { + sitekey: $(elem).attr('data-ipsCaptcha-key'), + size: 'invisible', + callback: function () { + form.attr( 'data-recaptcha-done', 'true' ); + form.submit(); + } + } ); + + form.on( 'submit', function( e ) { + if ( !form.attr( 'data-recaptcha-done') ) { + e.stopPropagation(); + e.preventDefault(); + grecaptcha.execute(recaptchaId); + } + }); + }; + + if( recaptchaLoaded ){ + initRecaptchaInvisible(); + } else { + $( window ).on( 'recaptcha2Loaded', function() { + recaptchaLoaded = true; + initRecaptchaInvisible(); + }); + } + }, /** * Keycaptcha captcha @@ -4272,7 +4361,7 @@ function recaptcha2Callback(){ }; }); }(jQuery, _));]]> - = currentRightPos && rightEdge < showing ){ + _loadItemImage( item ); + } + + if( rightEdge > showing ){ + return false; + } + } else { + if( leftEdge >= currentLeftPos && leftEdge < stayOnScreen ){ + _loadItemImage( item ); + } + + if( leftEdge > stayOnScreen ){ + return false; + } + } + }); }, /** @@ -4427,13 +4607,13 @@ function recaptcha2Callback(){ var elemWidth = 0; // Set the height of the carousel to be as high as the highest item - elem.css({ - height: maxHeight + ( parseInt( elem.css('padding-top') ) + parseInt( elem.css('padding-bottom') ) ) + 'px' + elem.find('.ipsCarousel_inner').css({ + height: maxHeight + ( parseInt( elem.find('.ipsCarousel_inner').css('padding-top') ) + parseInt( elem.find('.ipsCarousel_inner').css('padding-bottom') ) ) + 'px' }); // Are we making the items full width? if( options.fullSizeItems ){ - elemWidth = $( elem ).outerWidth( true ); + elemWidth = elem.find('.ipsCarousel_inner').outerWidth( true ); } // Now align all the other items vertically @@ -4448,6 +4628,10 @@ function recaptcha2Callback(){ } }); + elem.find( '[data-role="carouselItems"]' ).css({ + width: _getCurrentWidth() + 'px' + }) + currentFirstItem = elem.find( options.item ).first(); _buildNav(); @@ -4463,7 +4647,7 @@ function recaptcha2Callback(){ var maxHeight = _getMaxHeight(); // Set the height of the carousel to be as high as the highest item - elem.css({ + elem.find('.ipsCarousel_inner').css({ height: maxHeight + 'px' }); }, @@ -4554,7 +4738,7 @@ function recaptcha2Callback(){ var nextFirst = $( nextFirst ); if( !nextFirst.length ){ - Debug.error("nextFirst didn't exist"); + //Debug.error("nextFirst didn't exist"); deferred.resolve(); return deferred.promise(); } @@ -4576,12 +4760,16 @@ function recaptcha2Callback(){ currentLeftPos = nextFirstPos; // Now animate the list to the new position + animating = true; ui.itemList.animate( ( rtlMode ) ? { right: ( nextFirstPos * -1 ) + 'px' } : { left: ( nextFirstPos * -1 ) + 'px' } , 'slow', function () { - _checkNav(); - deferred.resolve(); - }); + _checkNav(); + animating = false; + _loadImagesInVisibleItems( nextFirst ); + deferred.resolve(); + } + ); return deferred.promise(); }, @@ -4598,7 +4786,7 @@ function recaptcha2Callback(){ // Get the first item which isn't completely shown; that will be our next first item var items = elem.find( options.item ).toArray(); - var wrapperWidth = elem.outerWidth(); + var wrapperWidth = elem.find('.ipsCarousel_inner').outerWidth(); var listWidth = _getCurrentWidth(); var stayOnScreen = currentLeftPos + wrapperWidth; var forcePrev = false; @@ -4612,10 +4800,12 @@ function recaptcha2Callback(){ if( idealLeft >= 0 || backToBeginning ){ currentLeftPos = 0; + animating = true; ui.itemList.animate( ( rtlMode ) ? { right: '0px' } : { left: '0px' } , 'slow', function () { _checkNav(); + animating = false; }); deferred.resolve(); @@ -4662,8 +4852,6 @@ function recaptcha2Callback(){ return false; }); - Debug.log('prev'); - // The method above has given us the first that is *partially* on screen // We actually want the next one though so we know it's fully on screen, // except on mobile @@ -4694,10 +4882,12 @@ function recaptcha2Callback(){ currentLeftPos = prevFirst.outerWidth() + wrapperWidth; } + animating = true; ui.itemList.animate( ( rtlMode ) ? { right: ( currentLeftPos * -1 ) + 'px' } : { left: ( currentLeftPos * -1 ) + 'px' } , 'slow', function () { _checkNav(); + animating = false; deferred.resolve(); }); @@ -4725,14 +4915,15 @@ function recaptcha2Callback(){ }, /** - * Sshows or hides the navigation elements, depending on current position of the carousel + * Shows or hides the navigation elements, depending on current position of the carousel * * @returns {void} */ _checkNav = function () { - var currentWidth = _getCurrentWidth(); + var container = elem.find('.ipsCarousel_inner')[0].getBoundingClientRect(); + var list = ui.itemList[0].getBoundingClientRect(); - if( ( currentWidth - currentLeftPos ) <= elem.outerWidth() ){ + if( Math.floor(list.right) <= Math.floor(container.right) ){ ui.next.hide().attr('data-disabled', true); if( ui.nextShadow.is(':visible') && options.shadows ){ ips.utils.anim.go('fadeOut fast', ui.nextShadow ); @@ -4744,7 +4935,7 @@ function recaptcha2Callback(){ } } - if( currentLeftPos <= 0 ){ + if( Math.floor(list.left) >= Math.floor(container.left) ){ ui.prev.hide().attr('data-disabled', true); if( ui.prevShadow.is(':visible') && options.shadows ){ ips.utils.anim.go('fadeOut fast', ui.prevShadow ); @@ -4785,14 +4976,14 @@ function recaptcha2Callback(){ }, /** - * EVent handler for window resizing + * Event handler for window resizing * * @returns {void} */ _resize = function () { // Are we making the items full width? if( options.fullSizeItems ){ - var elemWidth = $( elem ).outerWidth( true ); + var elemWidth = elem.find('.ipsCarousel_inner').outerWidth( true ); elem.find( options.item ).each( function (item) { $( this ).css({ @@ -4817,7 +5008,7 @@ function recaptcha2Callback(){ }; }); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -5035,7 +5226,7 @@ function recaptcha2Callback(){ }; }); }(jQuery, _)); - - fromPosition.viewportOffset.left ){ - widthOffset = widthOffset * -1; - } - - /*if( dialogPosition.viewportOffset.top < fromPosition.viewportOffset.top ){ - heightOffset = heightOffset * -1; - }*/ + var widthDifference = ( fromPosition.absPos.left + ( fromPositionWidth / 2 ) - dialogCenterLeft ); + var heightDifference = ( fromPosition.absPos.top + ( fromPositionHeight / 2 ) - dialogCenterTop ); $( dialog ) .show(); $( dialogBit ) .css({ - transform: 'translateY(' + heightOffset + 'px) translateX(' + widthOffset + 'px) scale(0.1)', + transform: 'translateY(' + heightDifference + 'px) translateX(' + widthDifference + 'px) scale(0.1)', opacity: 1 }) .animate( { transform: 'translateY(0px) translateX(0px) scale(1)', opacity: 1 - }, { easing: 'swing' } ); + }, { easing: 'swing', complete: function () { + dialog.find( '.' + options.className + '_loading').removeClass('ipsLoading_noAnim'); + } } ); }, /** @@ -6708,7 +6909,8 @@ function recaptcha2Callback(){ id: dialogID, fixed: options.fixed, size: options.size, - close: options.close + close: options.close, + extraClass: options.extraClass }) ); @@ -6875,7 +7077,7 @@ function recaptcha2Callback(){ hide(); if( options.flashMessage ){ - ips.ui.flashMsg.show( options.flashMessage, { timeout: options.flashMessageTimeout } ); + ips.ui.flashMsg.show( options.flashMessage, { timeout: options.flashMessageTimeout, escape: options.flashMessageEscape } ); } }; @@ -6928,7 +7130,7 @@ function recaptcha2Callback(){ }; }; }(jQuery, _));]]> - - and which interfere with our way of bolding/italicising (/) and make it impossible to unbold/italic if that tag is used - So what we're doing here is emulating CKEditor's semantic-content filter, but without b and i allowed, and also allowing some basic styles */ + have a special option ("semantic-content") for this, which is their default on Webkit, but this excludes colors and other styles users might reasonably use, + so what we're doing here is emulating CKEditor's semantic-content filter, but also allowing some basic styles */ if ( CKEDITOR.env.webkit ) { var tags = []; for ( var tag in CKEDITOR.dtd ) { - if ( tag.charAt( 0 ) != '$' && tag.charAt( 0 ) != 'b' && tag.charAt( 0 ) != 'i' ) { + if ( tag.charAt( 0 ) != '$' ) { tags.push(tag); } } @@ -7415,7 +7613,7 @@ function recaptcha2Callback(){ $( document ).on( 'fileDeleted', _deleteFile ); // And listen for emoticon inserts - $( document ).on( 'insertEmoticon', _insertEmoticon ); + $( document ).on( 'insertEmoji', _insertEmoji ); // Editor preview $( elem ).on( 'togglePreview', _togglePreview ); @@ -7425,7 +7623,7 @@ function recaptcha2Callback(){ /** * Destructs this object * - * @returns CKEDITOR.editor + * @returns void */ var destruct = function () { try { @@ -7443,6 +7641,19 @@ function recaptcha2Callback(){ } }; + /** + * Returns this instance of CKEditor + * + * @returns CKEDITOR.editor + */ + var getInstance = function () { + if( instance ){ + return instance; + } + + return null; + }; + /** * Stop listening to events for this editor * @@ -7452,7 +7663,7 @@ function recaptcha2Callback(){ $( window ).off( 'resize', resize ); $( document ).off( 'fileDeleted', _deleteFile ); $( document ).off( 'initializeEditor', _initializeEditor ); - $( document ).off( 'insertEmoticon', _insertEmoticon ); + $( document ).off( 'insertEmoji', _insertEmoji ); $( elem ).off( 'togglePreview', _togglePreview ); $( window ).off( 'message', _previewMessage ); }; @@ -7460,7 +7671,7 @@ function recaptcha2Callback(){ /** * Handles window resizes * - * @returns CKEDITOR.editor + * @returns void */ var resize = function (focus) { var width = elem.width(); @@ -7488,7 +7699,7 @@ function recaptcha2Callback(){ /** * Focus * - * @returns CKEDITOR.editor + * @returns void */ var focus = function () { instance.focus(); @@ -7498,7 +7709,7 @@ function recaptcha2Callback(){ * Unminimize * * @param {callback} callback Function to run after unminimized - * @returns CKEDITOR.editor + * @returns void */ var unminimize = function ( callback ) { if( !_.isFunction(callback) ){ @@ -7529,6 +7740,17 @@ function recaptcha2Callback(){ resize(true); hiddenAtStart = false; } + + instance.on( 'change', function(e) { + if ( ! changePolled ) { + changePolled = true; + ips.getAjax()( elem.parentsUntil( '', 'form' ).attr('action'), { + 'data': { + 'usingEditor': 1 + } + } ); + } + } ); } else { instance.once( 'instanceReady', function(){ minimized = false; @@ -7590,8 +7812,12 @@ function recaptcha2Callback(){ for ( var i = 0; i < quotes.length; i++ ) { var data = quotes[i]; + // Remove any lightboxes on the content (they'll be reapplied when viewing the quote) + var regex = /data-ipsLightbox(-group)?="([\w]+)?"/ig; + var html = data.quoteHtml.replace(regex, ''); + /* Build quote */ - var quote = $( ips.templates.render( 'core.editor.quote', { citation: ips.utils.getCitation( data ), contents: data.quoteHtml.trim() } ) ); + var quote = $( ips.templates.render( 'core.editor.quote', { citation: ips.utils.getCitation( data ), contents: html } ) ); var attrs = [ 'timestamp', 'userid', 'username', 'contentapp', 'contenttype', 'contentclass', 'contentid', 'contentcommentid' ]; var j = 0; for ( j in attrs ) { @@ -7797,7 +8023,7 @@ function recaptcha2Callback(){ } }); - var images = document.find('img'); + var images = document.find('img,video'); var toRemove = []; // Push items to remove into a new array because otherwise javascript removes all except one of the same attached image @@ -7832,35 +8058,21 @@ function recaptcha2Callback(){ }; /** - * Responds to an insertEmoticon event + * Responds to an insertEmoji event * * @param {event} e Event object * @param {object} data Data object from the event * @returns {boolean} */ - var _insertEmoticon = function (e, data) { - // Check we're working with this editor + var _insertEmoji = function (e, data) { try { if( _belongsToThisEditor( data ) ){ - if ( $('
        ' + instance.getData() + '
        ' ).find('img[data-emoticon]').length < 75 ) { - var imgTag = '' + data.text + '' + instance.getData() + '
' ).find('img[data-emoticon]').length >= 75 ) { var emoMessage = $(elem).closest('[data-ipsEditor]').find('[data-role="emoticonMessage"]'); emoMessage.slideDown(); @@ -7878,14 +8090,26 @@ function recaptcha2Callback(){ hideEmoMessage(); }); }, 2500); + + return; } + + /* Insert */ + instance.setReadOnly( false ); + instance.insertElement( element ); + if ( element.getName() == 'span' && element.hasClass( 'ipsEmoji' ) ) { + instance.widgets.initOn( element, 'ipsemoji' ); + } + + /* Add to recently used */ + ips.utils.emoji.logUse( data.emoji ); } } catch (err) { Debug.error("CKEditor instance couldn't be fetched"); return; - } + } }; - + //============================================================================================================ // EDITOR PREVIEW FUNCTIONALITY //============================================================================================================ @@ -8152,12 +8376,13 @@ function recaptcha2Callback(){ updateImage: updateImage, reset: reset, destruct: destruct, - saveAndClearAutosave: saveAndClearAutosave + saveAndClearAutosave: saveAndClearAutosave, + getInstance: getInstance }; }; }(jQuery, _));]]> - /* global ips, _ */ + /* global ips, _ */ /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com @@ -8432,7 +8657,7 @@ function recaptcha2Callback(){ }; }; }(jQuery, _)); - - - + - - - - - " ); + + var handlePopup = function (e) { + var popup = e.target.getPopup(); + var clubID = e.target.options.clubID; + + ips.getAjax()( options.contentUrl + clubID ).done( function (response) { + popup.setContent( response ); + popup.update(); + }); + }; + + ips.loader.get( [ 'https://api.mapbox.com/mapbox.js/v3.1.1/mapbox.js' ] ).then( function () { + ips.loader.get( [ 'https://api.mapbox.com/mapbox.js/plugins/leaflet-markercluster/v1.0.0/leaflet.markercluster.js' ] ).then( function () { + L.mapbox.accessToken = ips.getSetting('mapApiKey'); + var map = L.mapbox.map( elem.get(0), 'mapbox.streets').setView([45, 0], options.zoom); + + var cluster = new L.MarkerClusterGroup(); + map.addLayer( cluster ); + + var markers = $.parseJSON( options.markers ); + for ( var id in markers ) { + var marker = L.marker([markers[id].lat, markers[id].long], { + icon: L.mapbox.marker.icon({ + 'marker-color': '#0000ff' + }), + clubID: id, + title: markers[id].title, + draggable: false + }).addTo(map); + + cluster.addLayer( marker ); + + // Build info popup for this marker + if( options.contentUrl ){ + marker.bindPopup( ips.getString('loading') ); + marker.on('click', handlePopup ); + } + } + }); + }); + }; + + /** + * Handle google maps + * + * @returns {void} + */ + var _google = function (elem, options) { + + if ( typeof google === 'undefined' || typeof google.maps === 'undefined' ) { + ips.loader.get( [ 'https://maps.googleapis.com/maps/api/js?key=' + ips.getSetting('mapApiKey') + '&libraries=places&sensor=false&callback=ips.ui.map.googleCallback' ] ); + } else { + ips.ui.map.googleCallback(); + } $( window ).on( 'googleApiLoaded', function(){ - var map = new google.maps.Map( elem.get(0), { + var mapOptions = { zoom: options.zoom, - center: { lat: 45, lng: 0 }, scrollwheel: false - }); + }; + if ( options.zoom ) { + mapOptions.center = { lat: 45, lng: 0 }; + } else { + mapOptions.center = { lat: 30, lng: 0 }; + } + + var map = new google.maps.Map( elem.get(0), mapOptions); var infowindow = new google.maps.InfoWindow({ content: ips.getString('loading') @@ -11863,9 +12224,6 @@ function recaptcha2Callback(){ position: { lat: markers[id].lat, lng: markers[id].long }, map: map, title: markers[id].title, - icon: { - fillColor: 'blue' - }, id: id }); @@ -11886,11 +12244,16 @@ function recaptcha2Callback(){ }); }; + /** + * Provides a callback for Google Maps API + * + * @returns {void} + */ var googleCallback = function(){ $( window ).trigger( 'googleApiLoaded' ); }; - ips.ui.registerWidget('map', ips.ui.map, [ 'apiKey', 'zoom', 'markers', 'contentUrl' ] ); + ips.ui.registerWidget('map', ips.ui.map, [ 'zoom', 'markers', 'contentUrl' ] ); return { respond: respond, @@ -11898,7 +12261,7 @@ function recaptcha2Callback(){ }; }); }(jQuery, _));]]> - - - - 2 || e.type != "keyup" ){ - _timer = setTimeout( _changePassword, 200 ); + _timer = setTimeout( _changePassword, 750 ); } else { _clearResult(); } @@ -13340,7 +13702,7 @@ function recaptcha2Callback(){ if( response.score >= parseInt( options.enforcedStrength ) ){ // If our score is above the threshold show the success state - resultElem.show().html( ips.templates.render('core.forms.validateOk') ); + resultElem.hide().html(''); _field.addClass('ipsField_success'); // If the row has error status (i.e. we arrived at this page with an error) @@ -13355,7 +13717,7 @@ function recaptcha2Callback(){ if( _passwordBlurred ){ resultElem .show() - .html( ips.templates.render( 'core.forms.validateFail', { + .html( ips.templates.render( 'core.forms.validateFailText', { message: ips.getString('err_password_strength', { strength: ips.getString('strength_' + options.enforcedStrength ) }) @@ -13365,7 +13727,7 @@ function recaptcha2Callback(){ } } } else { - resultElem.show().html( ips.templates.render( 'core.forms.validateFail', { message: response.message } ) ); + resultElem.show().html( ips.templates.render( 'core.forms.validateFailText', { message: response.message } ) ); _field.removeClass('ipsField_success').addClass('ipsField_error'); } }) @@ -13401,6 +13763,10 @@ function recaptcha2Callback(){ $('body').append( tmpPopup ); _popup = $('body').find( '#elPasswordAdvice_' + elem.identify().attr('id') ); + + _popup.css({ + position: 'absolute' + }); }, /** @@ -13410,7 +13776,7 @@ function recaptcha2Callback(){ */ _positionAdvicePopup = function () { var isRTL = $('html').attr('dir') == 'rtl'; - var position = _field.offset(); + var position = ips.utils.position.getElemPosition( _field ); var fieldWidth = _field.width(); var fieldHeight = _field.height(); var adviceWidth = _popup.width(); @@ -13421,30 +13787,29 @@ function recaptcha2Callback(){ _popup .removeClass('cStem_rtl cStem_ltr cStem_above') .css({ - position: 'absolute', zIndex: ips.ui.zIndex() }); - if( isRTL && ( position.left - adviceWidth - stemOffset ) > 0 ){ + if( isRTL && ( position.absPos.left - adviceWidth - stemOffset ) > 0 ){ _popup .addClass('cStem_rtl') .css({ - top: ( position.top - ( stemOffset / 2 ) ) + 'px', - left: ( position.left - stemOffset - adviceWidth ) + 'px' + top: ( position.absPos.top - ( stemOffset / 2 ) ) + 'px', + left: ( position.absPos.left - stemOffset - adviceWidth ) + 'px' }); - } else if( !isRTL && ( position.left + fieldWidth + adviceWidth + stemOffset ) < windowWidth ) { + } else if( !isRTL && ( position.absPos.left + fieldWidth + adviceWidth + stemOffset ) < windowWidth ) { _popup .addClass('cStem_ltr') .css({ - top: ( position.top - ( stemOffset / 2 ) ) + 'px', - left: ( position.left + fieldWidth + stemOffset ) + 'px' + top: ( position.absPos.top - ( stemOffset / 2 ) ) + 'px', + left: ( position.absPos.left + fieldWidth + stemOffset ) + 'px' }); } else { _popup .addClass('cStem_above') .css({ - top: ( position.top - ( stemOffset / 2 ) - adviceHeight ) + 'px', - left: ( position.left + ( fieldWidth / 2 ) - ( adviceWidth / 2 ) ) + 'px' + top: ( position.absPos.top - ( stemOffset / 2 ) - adviceHeight ) + 'px', + left: ( position.absPos.left + ( fieldWidth / 2 ) - ( adviceWidth / 2 ) ) + 'px' }); } }; @@ -13457,7 +13822,7 @@ function recaptcha2Callback(){ }; }(jQuery, _));]]> - [class*="ipsGrid_span"]').first(); + return elem.find('.ipsPatchwork > [class*="ipsGrid_span"]').first(); }, /** @@ -13743,7 +14108,7 @@ function recaptcha2Callback(){ }; }); }(jQuery, _));]]> - '); var windowWidth = 0; var checkboxes = []; + var timer = null; /** * Sets up this instance @@ -13841,7 +14207,7 @@ function recaptcha2Callback(){ elem.empty(); run( imageData ); - setInterval( function () { + timer = setInterval( function () { _checkCurrentWidth(); }, 300 ); @@ -13860,7 +14226,7 @@ function recaptcha2Callback(){ var newWidth = Math.floor( elem.width() ); if( currentWidth !== newWidth ){ - Debug.log("Width has changed; rebuilding"); + currentWidth = newWidth; _resizeWindow(true); } }, @@ -13872,6 +14238,7 @@ function recaptcha2Callback(){ */ destruct = function () { $( window ).off( 'resize', _resizeWindow ); + clearInterval( timer ); }, /** @@ -13894,8 +14261,14 @@ function recaptcha2Callback(){ * @returns {void} */ run = function (data) { - var initialHeight = Math.max( options.minHeight, Math.floor( currentWidth / options.maxItems ) ); + // We can't run the resize process if we aren't showing right now + if( !elem.is(':visible') ){ + return; + } + + var initialHeight = Math.max( options.minHeight, Math.floor( currentWidth / options.maxItems ) ); + var currentWidthForCalc = ( currentWidth - options.gap ); // Get relative sizes var relativeSizes = []; @@ -13942,7 +14315,7 @@ function recaptcha2Callback(){ var widthOfRow = 0; // Figure out how many images to show in this row and how wide it will be - while ( ( widthOfRow * 1.1 < currentWidth ) && ( imagesSoFar + imagesInRow < noOfPhotos ) ) { + while ( ( widthOfRow * 1.1 < currentWidthForCalc ) && ( imagesSoFar + imagesInRow < noOfPhotos ) ) { var gap = options.gap * 2; if( imagesInRow === 0 ){ @@ -13956,7 +14329,7 @@ function recaptcha2Callback(){ widthOfRow -= options.gap; var row = _getRow(); - var ratio = currentWidth / widthOfRow; + var ratio = ( currentWidthForCalc ) / widthOfRow; var lastRowNotFit = false; var i = 0; @@ -14054,18 +14427,18 @@ function recaptcha2Callback(){ _buildItem = function (imageData, extra) { // Calculate retina sizes - var multipliedWidth = extra.width * window.devicePixelRatio; - var multipliedHeight = extra.height * window.devicePixelRatio; + var multipliedWidth = extra.width;// * window.devicePixelRatio; + var multipliedHeight = extra.height;// * window.devicePixelRatio; var showThumb = true; if( !_.isString( imageData.filenames.small[0] ) ){ showThumb = false } else { - // If the width/height we'll show at is bigger than the small image size, use the medium size instead + // If the width/height we'll show at is bigger than the small image size, use the large size instead if( multipliedWidth <= imageData.filenames.small[1] && multipliedHeight <= imageData.filenames.small[2] ){ imageData.src = imageData.filenames.small[0]; } else { - imageData.src = imageData.filenames.medium[0]; + imageData.src = imageData.filenames.large[0]; } } @@ -14133,7 +14506,6 @@ function recaptcha2Callback(){ // Necessary because mobile browsers change the height to show the address bar when scrolling if( force || $( window ).width() !== windowWidth ){ elem.empty(); - currentWidth = Math.floor( elem.width() ); noOfPhotos = imageData.length; run( imageData ); } @@ -14168,7 +14540,7 @@ function recaptcha2Callback(){ }; }; }(jQuery, _));]]> - - - - - - - - - .' + options.panelClass ) .hide() .attr('aria-hidden', 'true'); }, @@ -16679,7 +17059,7 @@ function recaptcha2Callback(){ }; }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -16860,7 +17240,7 @@ function recaptcha2Callback(){ }; }(jQuery, _)); - - - ').append( $('').attr( { src: info.videosrc, type: fileElem.attr('data-mimeType') } ) ); + fileElem + .attr( 'data-fullsizeurl', info.videosrc ) + .find('[data-role="preview"]') + .html( toInsert ); } + fileElem.attr( 'data-fileid', info.id ); }, @@ -17885,7 +18288,7 @@ function recaptcha2Callback(){ return false; } } else if( options.maxFiles ) { - if( up.files.length > options.maxFiles || ( uploadCount + files.length ) > options.maxFiles ){ + if( files.length > options.maxFiles || ( uploadCount + files.length ) > options.maxFiles ){ ips.ui.alert.show( { type: 'alert', icon: 'warn', @@ -17898,10 +18301,16 @@ function recaptcha2Callback(){ return false; } } else if( options.maxTotalSize && up.total.size > ( options.maxTotalSize * 1048576 ) ) { + ips.ui.alert.show( { type: 'alert', icon: 'warn', - message: ips.getString( 'uploadTotalErr', { size: ( options.maxTotalSize > 1 ) ? options.maxTotalSize : ( options.maxTotalSize * 1024 ), size_suffix: ( options.maxTotalSize > 1 ) ? ips.getString('size_mb') : ips.getString('size_kb') } ), + message: ips.getString( 'uploadTotalErr', { + size: parseFloat( + ( options.maxTotalSize > 1 ) ? options.maxTotalSize : ( options.maxTotalSize * 1024 ) + ).toLocaleString( $('html').attr('lang') ), + size_suffix: ( options.maxTotalSize > 1 ) ? ips.getString('size_mb') : ips.getString('size_kb') + } ), callbacks: {} }); _.each(files, function (file, idx) { @@ -17933,17 +18342,22 @@ function recaptcha2Callback(){ var size = plupload.formatSize( file.size ), status = _getStatus( file.status ), - isImage = false; + isImage = false, + isVideo = false; - // Figure out if this is an image based on extension + // Figure out if this is an video or image based on extension if( [ 'jpg', 'jpeg', 'jpe', 'gif', 'png' ].indexOf( file.name.substr( ( ~-file.name.lastIndexOf(".") >>> 0 ) + 2 ).toLowerCase() ) !== -1 ){ isImage = true; } + if( [ 'mp4', '3gp', 'mov', 'ogg', 'ogv', 'mpg', 'mpeg', 'flv', 'webm', 'wmv', 'avi', 'm4v' ].indexOf( file.name.substr( ( ~-file.name.lastIndexOf(".") >>> 0 ) + 2 ).toLowerCase() ) !== -1 ){ + isVideo = true; + } var data = { uploaderID: uploaderID, id: file.id, title: file.name, + mime: file.type, size: size, status: status, statusCode: file.status, @@ -17951,9 +18365,10 @@ function recaptcha2Callback(){ field_name: elem.attr('data-ipsUploader-name'), newUpload: true, insertable: true, - isImage: isImage + isImage: isImage, + isVideo: isVideo }; - + // Trigger event for adding the file element, to allow controllers to intercept $( elem ).trigger( 'addUploaderFile', data ); @@ -17965,7 +18380,9 @@ function recaptcha2Callback(){ // Do we need to warn the user? if( tooLarge ){ var errorString = ips.getString( 'uploadSizeErr', { - max_file_size: ( options.maxFileSize > 1 ) ? options.maxFileSize : ( options.maxFileSize * 1024 ), + max_file_size: parseFloat( + ( options.maxFileSize > 1 ) ? options.maxFileSize : ( options.maxFileSize * 1024 ) + ).toLocaleString( $('html').attr('lang') ), size_suffix: ( options.maxFileSize > 1 ) ? ips.getString('size_mb') : ips.getString('size_kb') }); @@ -18081,7 +18498,7 @@ function recaptcha2Callback(){ ips.utils.notification.create({ title: ips.pluralize( ips.getString('yourUploadsFinished'), [ total ] ), body: text.join(' '), - icon: ips.getSetting('imgURL') + '/notifyIcons/upload.png', + icon: ips.getSetting('upload_imgURL'), onClick: function () { try { window.focus(); @@ -18090,13 +18507,11 @@ function recaptcha2Callback(){ }).show(); } - ips.loader.get( ['core/interface/buzz/buzz.min.js'] ).then( function () { - var sound = new buzz.sound( ips.getSetting('baseURL') + 'applications/core/interface/sounds/success', { - webAudioApi: true, - formats: [ "mp3" ] - }); - sound.play(); - }); + if( sound ){ + try { + sound.play(); + } catch (err) { } + } }, /** @@ -18180,7 +18595,9 @@ function recaptcha2Callback(){ } var errorMessage = ips.getString( 'pluploaderr_' + err.code, { - max_file_size: ( options.maxFileSize > 1 ) ? options.maxFileSize : ( options.maxFileSize * 1024 ), + max_file_size: parseFloat( + ( options.maxFileSize > 1 ) ? options.maxFileSize : ( options.maxFileSize * 1024 ) + ).toLocaleString( $('html').attr('lang') ), size_suffix: ( options.maxFileSize > 1 ) ? ips.getString('size_mb') : ips.getString('size_kb'), allowed_extensions: ( options.allowedFileTypes !== null ) ? $.parseJSON( options.allowedFileTypes ).join(',') : '', server_error_code: ( err.extra !== null ) ? err.extra : 0 @@ -18210,7 +18627,7 @@ function recaptcha2Callback(){ } }(jQuery, _));]]> - - - - - - - - - - -1 && code.match( /^1F1(E[6-9A-F]|F[0-9A-F])/ ) ) { + return false; + } + + /* Load the canvas if we haven't already */ + if ( this._testingCanvasContext == null ) { + var testingCanvas = document.createElement('canvas'); + testingCanvas.width = 8; + testingCanvas.height = 6; + if ( testingCanvas && testingCanvas.getContext && typeof String.fromCodePoint == 'function' ) { + this._testingCanvasContext = testingCanvas.getContext('2d'); + if ( typeof this._testingCanvasContext.fillText == 'function' ) { + this._testingCanvasContext.textBaseline = 'top'; + this._testingCanvasContext.font = '5px "Apple Color Emoji", "Segoe UI Emoji", "NotoColorEmoji", "Segoe UI Symbol", "Android Emoji", "EmojiSymbols"'; + + /* Draw a deliberately invalid character (x1 and x2) so that we can compare it with valid emojis to see if they were rendered properly */ + this._testingCanvasContext.fillText( String.fromCodePoint( parseInt( '1F91F', 16 ) ), 0, 0 ); + this._invalidCharacterImageData.push( Array.prototype.toString.call( this._testingCanvasContext.getImageData( 0, 0, 6, 6 ).data ) ); + this._testingCanvasContext.clearRect( 0, 0, 8, 6 ); + this._testingCanvasContext.fillText( String.fromCodePoint( parseInt( '1F91F', 16 ) ) + String.fromCodePoint( parseInt( '1F91F', 16 ) ), 0, 0 ); + this._invalidCharacterImageData.push( Array.prototype.toString.call( this._testingCanvasContext.getImageData( 0, 0, 6, 6 ).data ) ); + } else { + return false; + } + } else { + return false; + } + } + + /* Clear the canvas */ + this._testingCanvasContext.clearRect( 0, 0, 8, 6 ); + + /* Draw the character */ + var emoji = this.emojiFromHex( code ); + if ( emoji == null ) { + return false; + } + this._testingCanvasContext.fillText( emoji, 0, 0 ); + + /* If it rendered the same as the deliberately invalid character, or it's blank, we know it can't be rendered */ + if ( this._invalidCharacterImageData.indexOf( Array.prototype.toString.call( this._testingCanvasContext.getImageData( 0, 0, 6, 6 ).data ) ) != -1 ) { + return false; + } + + /* Look at an imaginary line down the right side, if it's *not* totally blank, there is probably two characters + (i.e. the base character and a modifier like a gender sign), so assume this emoji not supported */ + if ( Array.prototype.toString.call( this._testingCanvasContext.getImageData( 7, 0, 1, 6 ).data ) != '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0' ) { + return false; + } + + /* Return true */ + return true; + }, + + /** + * Get emoji character from hex + * + * @param {string} hex Hexadecimal code(s) separated by - + * @returns {string|null} + */ + emojiFromHex = function(hex) { + try { + var decimals = []; + var hexPoints = hex.split('-'); + for ( var p = 0; p < hexPoints.length; p++ ) { + decimals.push( parseInt( hexPoints[p], 16 ) ); + } + + return String.fromCodePoint.apply( null, decimals ); + } catch ( err ) { + return null; + } + }, + + /** + * Get emoji image from hex + * + * @param {string} codeToUse Hexadecimal code(s) separated by - + * @returns {string|null} + */ + emojiImage = function( codeToUse ) { + if ( codeToUse.substr( 0, 7 ) == 'custom-' ) { + var store = this._allemoji || this._emoji; + var parts = codeToUse.split('-'); + for ( var i = 0; i < store[ parts[1] ].length; i++ ) { + if( store[ parts[1] ][i].code == codeToUse ) { + var imgTag = '' + store[ parts[1] ][i].name + ''; + } + }, + + /** + * Get the code for an emoji with a skin tone modifier + * + * @param {string} code Hexadecimal code(s) separated by - + * @param {string} tone Skin tone to use (light, medium, etc) + * @returns {string|null} + */ + tonedCode = function( code, tone ) { + switch ( tone ) { + case 'light': + return code.replace( /^([0-9A-F]*)(\-|$)(?:FE0F\-)?/, '$1-1F3FB$2' ); + break; + case 'medium-light': + return code.replace( /^([0-9A-F]*)(\-|$)(?:FE0F\-)?/, '$1-1F3FC$2' ); + break; + case 'medium': + return code.replace( /^([0-9A-F]*)(\-|$)(?:FE0F\-)?/, '$1-1F3FD$2' ); + break; + case 'medium-dark': + return code.replace( /^([0-9A-F]*)(\-|$)(?:FE0F\-)?/, '$1-1F3FE$2' ); + break; + case 'dark': + return code.replace( /^([0-9A-F]*)(\-|$)(?:FE0F\-)?/, '$1-1F3FF$2' ); + break; + } + return code; + }, + + /** + * Get HTML to preview a particular emoji + * + * @param {string} code Hexadecimal code(s) separated by - + * @returns {string} + */ + preview = function(code) { + if ( ips.getSetting('emoji_style') == 'native' && code.substr( 0, 7 ) != 'custom-' ) { + return "" + this.emojiFromHex( code ) + ''; + } + else { + return this.emojiImage( code ); + } + }, + + /** + * Get the CKEditor element to use for a particular emoji + * + * @param {string} code Hexadecimal code(s) separated by - + * @returns {CKEDITOR.dom.element} + */ + editorElement = function( code ) { + if ( ips.getSetting('emoji_style') == 'native' && code.substr( 0, 7 ) != 'custom-' ) { + return CKEDITOR.dom.element.createFromHtml( "" + this.emojiFromHex( code ) + "" ); + } else { + return CKEDITOR.dom.element.createFromHtml( this.emojiImage( code ) ); + } + }, + + /** + * Log that an emoji has been used for the "Recently Used" section + * + * @param {string} code Hexadecimal code(s) separated by - + * @returns {CKEDITOR.dom.element} + */ + logUse = function( code ) { + var recentEmoji = []; + if ( ips.utils.cookie.get( 'recentEmoji' ) ) { + recentEmoji = ips.utils.cookie.get( 'recentEmoji' ).split(','); + } + + var index = recentEmoji.indexOf( code ); + if ( index != -1 ) { + recentEmoji.splice( index, 1 ); + } + recentEmoji.unshift(code); + recentEmoji.splice( 24 ); + + ips.utils.cookie.set( 'recentEmoji', recentEmoji.join(','), true ); + }; + + return { + init: init, + getEmoji: getEmoji, + canRender: canRender, + emojiFromHex: emojiFromHex, + emojiImage: emojiImage, + tonedCode: tonedCode, + preview: preview, + editorElement: editorElement, + logUse: logUse + }; + }); + +}(jQuery, _));]]> + - - - - theWindow.height() ){ - position.vertical = 'top'; + if( attemptToFit ){ + if( position.vertical == 'top' || preferBottom ){ + if( ( viewportOffset.top - targetDims.outerHeight - offset.top ) < 0 ){ + position.vertical = 'bottom'; + } + } else { + if( ( viewportOffset.top + triggerDims.outerHeight + targetDims.outerHeight + offset.top ) > theWindow.height() ){ + position.vertical = 'top'; + } } } @@ -20862,7 +21627,7 @@ function recaptcha2Callback(){ }); }(jQuery, _)); ]]> - - 0 ){ + var range = selection.getRangeAt(0); + var clonedSelection = range.cloneContents().querySelector( querySelector ); + + // This loop checks that the selection is within the ancestor, so that we don't + // show Quote This accidentally when another comment is selected. + for (var i = 0; i < selection.rangeCount; ++i) { + if( !_isChild( selection.getRangeAt(i).commonAncestorContainer, container ) ){ + return ''; + } + } + + if( clonedSelection ){ + text = clonedSelection.innerHTML; + } else { + clonedSelection = range.cloneContents(); + var startNode = selection.getRangeAt(0).startContainer.parentNode; + + if( _isChild( startNode, container ) ) { + var div = document.createElement('div'); + div.appendChild( clonedSelection ); + text = div.innerHTML; + } + } + + return text; + } else if ( document.selection ){ + return document.selection.createRange().htmlText; + } + + return ''; + }; + + var getRange = function () { + var selection = getSelection(); + + if( selection.isCollapsed ){ + return null; + } + + return selection.getRangeAt(0); + }; + + /** + * Returns the correct selection + * + * @returns {object} + */ + var getSelection = function () { + return ( window.getSelection ) ? window.getSelection() : document.getSelection(); + }; + + /** + * Returns boolean indicating whether child belongs to parent + * + * @param {element} child Child element + * @param {element} parent Parent element + * @returns {void} + */ + var _isChild = function (child, parent) { + if(child === parent){ + return true; + } + + var current = child; + + while (current) { + if(current === parent){ + return true; + } + current = current.parentNode; + } + + return false; + }; + + return { + getSelectedText: getSelectedText, + getSelection: getSelection, + getRange: getRange + }; + }); +}(jQuery, _));]]> + = 12 ) ? hrs - 12 : hrs; + hrs = ( hrs > 12 ) ? hrs - 12 : hrs; + + if( hrs == 0 ) + { + hrs = 12; + } + return ( ( hrs.length === 1 ) ? '0' : '' ) + hrs; }, "l": function (d) { // Hour in 12-hour format, with a space preceding single digits var hrs = d.getHours(); - hrs = ( hrs >= 12 ) ? hrs - 12 : hrs; + hrs = ( hrs > 12 ) ? hrs - 12 : hrs; + + if( hrs == 0 ) + { + hrs = 12; + } + return ( ( hrs.length === 1 ) ? ' ' : '' ) + hrs; }, "M": function (d) { // Two digit representation of the min @@ -21586,7 +22480,7 @@ function recaptcha2Callback(){ } }; - return localeFormat.format.replace(/%([aAdejuwUVWbBhmCgGyYHkIlMNPprRSTXzZcDFsxnt%])/g, function (match0, match1) { + return localeFormat.format.replace(/%([aAdejuwUVWbBhmCgGyYHkIlMNPprRSTXzZcDFsxnt%]|OB)/g, function (match0, match1) { if( formatters[ match1 ] ){ return formatters[ match1 ]( dateObj ); } @@ -21851,7 +22745,7 @@ function recaptcha2Callback(){ }; }); }(jQuery, _));]]> - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -22543,7 +23498,7 @@ var escapeRegExp; }); }(jQuery, _)); - - " + tabTitle + "" + ); + + // Add the new tab content area + $('#' + identifier ).append( + "" + ); + + // Hide the button + ips.utils.anim.go( 'fadeOut fast', self.scope.find('[data-role="saveReport"]') ); + + // Make sure we update URL correctly moving forward + self._skipUpdate = false; + + // And trigger content change event + $( document ).trigger( 'contentChange', [ self.scope ] ); + + // Clear input field + $('#el' + self.identifier + 'FilterSave_menu').find('[name="custom_chart_title"]').val( '' ); + + // And then switch to the tab + $('#' + response.tabId + "_tab_" + response.chartId ).click(); + }) + .fail( function () { + $(this).attr( 'data-bypassValidation', true ).submit(); + }); + }); + } + else + { + // Send AJAX request to save report + ips.getAjax()( this.scope.attr('data-chart-url') + '&saveFilters=1&chartId=' + $( event.currentTarget ).attr('data-chartId'), { + data: newFilters + }); + + // Hide the button + ips.utils.anim.go( 'fadeOut fast', this.scope.find('[data-role="saveReport"]') ); + + // And update the chart + this._updateURL(); + } + }, + + /** + * Rename the current filters + * + * @returns {void} + */ + renameFilters: function( event ) + { + // Init + var identifier = this.scope.closest('.ipsTabs_panel').closest('section').attr('id'); + + // Set an event handler for the form submission where we specify the chart title + $('#el' + this.identifier + 'FilterRename_menu').on( 'submit', 'form', function( e ){ + if( $(this).attr('data-bypassValidation') ){ + return false; + } + + // Hide the menu + $(this).trigger('closeMenu'); + + e.preventDefault(); + + ips.getAjax()( $(this).attr('action'), { + data: $(this).serialize(), + type: 'post' + } ) + .done( function (response, status, jqXHR) { + // Update the tab + $('[data-ipsTabBar-contentArea="#' + identifier + '"]').find('ul[role="tablist"]').find('.ipsTabs_activeItem').text( response.title ); + }) + .fail( function () { + $(this).attr( 'data-bypassValidation', true ).submit(); + }); + }); + }, + /** * Changes the range of the graph being shown * @@ -22935,6 +24084,18 @@ var escapeRegExp; this.storedValues[ type ] = val; + // Reset filters + this._resetFilters(); + + this._updateURL(); + }, + + /** + * Reset our stored filters to only include what we presently have selected + * + * @return {void} + */ + _resetFilters: function() { // Reset filters var self = this; this.storedValues.filters = []; @@ -22942,16 +24103,23 @@ var escapeRegExp; $('#el' + this.identifier + 'Filter_menu').find('.ipsMenu_itemChecked').each( function () { self.storedValues.filters.push( $( this ).attr('data-ipsMenuValue') ); }); - - this._updateURL(); }, + _skipUpdate: false, + /** * Fetches new chart HTML from the server, then reinits the chart widget * * @returns {void} */ _updateURL: function () { + // We skip updating the chart when clicking over to the save button the first time + if( this._skipUpdate === true ) + { + this._skipUpdate = false; + return; + } + var url = this._buildURL(); var chartArea = this.scope.find('[data-role="chart"]'); chartArea.css( 'height', chartArea.height() ).html( '' ).addClass('ipsLoading'); @@ -22966,6 +24134,8 @@ var escapeRegExp; .always( function () { chartArea.removeClass('ipsLoading'); }); + + $('button[data-role="applyFilters"]').prop( 'disabled', true ); }, /** @@ -23001,7 +24171,169 @@ var escapeRegExp; } }); }(jQuery, _));]]> - [data-role="text"]'); + span.hide(); + + var inputNode = $('').attr( { type: 'text' } ).attr( 'data-role', 'editField' ).val( textField.text().trim() ); + + if( !_.isUndefined( span.attr('data-center') ) ){ + inputNode.addClass('ipsType_center'); + } + + span.after(inputNode); + inputNode.focus(); + + inputNode.on('blur', function(){ + inputNode.addClass('ipsField_loading'); + if( inputNode.val() == '' ){ + inputNode.remove(); + span.show(); + self._editing = false; + } else { + ips.getAjax()( url, { method: 'post', data: { + [fieldName]: inputNode.val() + } } ) + .done( function(response) { + textField.text( inputNode.val() ); + }) + .fail( function(response) { + ips.ui.alert.show( { + type: 'alert', + icon: 'warn', + message: response.responseJSON, + }); + }) + .always(function(){ + inputNode.remove(); + span.show(); + self._editing = false; + }); + } + + }); + + inputNode.on('keypress', function(e){ + if( e.keyCode == ips.ui.key.ENTER ){ + e.stopPropagation(); + e.preventDefault(); + inputNode.blur(); + return false; + } + }); + + // Chrome requires checking keydown instead for escape + inputNode.on('keydown', function(e){ + if( e.keyCode == ips.ui.key.ESCAPE ){ + inputNode.remove(); + span.show(); + self._editing = false; + return false; + } + }); + }, + }); +}(jQuery, _)); +]]> + - - /** + * Invision Community + * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com + * + * ips.core.licenseRenewal.js - License Renewal message + * + * Author: Stuart Silvester + */ +;( function($, _, undefined){ + "use strict"; + + ips.controller.register('core.admin.core.licenseRenewal', { + initialize: function () { + this.on( 'click', '', this.renewalPrompt ); + this.on(document, 'click', '[data-action="closeLicenseRenewal"]', this.close); + }, + + renewalPrompt: function(e) { + // Don't show modal if 'renew now' is clicked + if( $(e.target).is('.elRenewLink') ) + { + return; + } + + this._modal = ips.ui.getModal(); + + var container = ips.templates.render('licenseRenewal.wrapper'); + + $('body').append( container ); + this._container = $('body').find('[data-role="licenseRenewal"]').css({ opacity: 0.001, transform: "scale(0.8)" }); + + // Set the survey URL + $('body').find( '[data-action="survey"]').attr( 'href', $('#elLicenseRenewal').attr( 'data-surveyUrl' ) ); + + this._modal.css( { zIndex: ips.ui.zIndex() } ); + var self = this; + + // Animate the modal in + setTimeout( function () { + self._container.css( { zIndex: ips.ui.zIndex() } ); + self._container.animate({ + opacity: 1, + transform: "scale(1)" + }, 'fast'); + }, 500); + + ips.utils.anim.go('fadeIn', this._modal); + + }, + + /** + * Close the popup + * + * @returns {void} + */ + close: function (e) { + if( e ){ + e.preventDefault(); + } + + if( this._container.find( 'input[type=checkbox][name=hideRenewalNotice]' ).is(':checked') ) + { + $('#elLicenseRenewal').slideUp(); + var date = new Date(); + date.setTime( date.getTime() + ( 16 * 86400000 ) ); + ips.utils.cookie.set( 'licenseRenewDismiss', true, date.toUTCString() ); + } + + this._container.animate({ + transform: "scale(0.7)", + opacity: 0 + }, 'fast'); + + ips.utils.anim.go('fadeOut', this._modal); + } + }); +}(jQuery, _)); + 0 && key == self._defaultTab ) { + if ( response.length > 0 && key == self._defaultTab && self._activePanel == self._defaultTab ) { tab.click(); } }).fail( function (err) { @@ -23577,7 +24989,7 @@ var escapeRegExp; } }); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -23611,7 +25023,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -24005,7 +25421,91 @@ var escapeRegExp; }); }(jQuery, _)); - /** + * Invision Community + * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com + * + * ips.core.announcementBanner.js - Announcement Banners + * + * Author: Stuart Silvester + */ +;( function($, _, undefined){ + "use strict"; + + ips.controller.register('core.front.core.announcementBanner', { + + /** + * Initialise event handlers + * + * @returns {void} + */ + initialize: function () { + this.setup(); + + this.on( 'click', '[data-role="dismissAnnouncement"]', this.dismissAnnouncement ); + this.on( document, 'announcements.reflow', this.reflow ); + this.on( window, 'resize', this.reflow ); + }, + + /** + * Set up CSS for announcements + * + * @returns {void} + */ + setup: function() + { + $('.cAnnouncements').addClass( 'cAnnouncementsFloat' ).css( 'zIndex', ips.ui.zIndex() ); + + this.reflow(); + }, + + /** + * Dismiss Announcement + * + * @param {event} e Event object + * @returns {void} + */ + dismissAnnouncement: function ( e ) { + if( e ){ + e.preventDefault(); + } + + var element = $( e.target ).closest('[data-announcementId]'); + var id = element.attr('data-announcementId'); + + var date = new Date(); + date.setTime( date.getTime() + ( 7 * 86400000 ) ); + ips.utils.cookie.set( 'announcement_' + id, true, date.toUTCString() ); + + element.slideUp( { + duration: 400, + complete: function() { + $(this).remove(); + + $(document).trigger('announcements.reflow' ); + }, + progress: function() { + $(document).trigger('announcements.reflow' ); + } + }); + }, + + /** + * Adjust the body margin + * + * @param {event} e Event object + * @returns {void} + */ + reflow: function( e ) + { + var height = $('.cAnnouncements').outerHeight(); + + $( 'body' ).css( 'margin-top', height + 'px' ); + } + + }); +}(jQuery, _)); + "); + } ); } }); }(jQuery, _)); ]]> - - - ' + selectedText + '

'; } - if( selectedText !== this._selectedText ){ - this._selectionCoords = { - top: 0, - left: 0 - }; + if( this._selectedText == selectedText ){ + return; } - + this._selectedText = selectedText; - this._showQuoteTooltip( e ); - }, - - /** - * Returns the selected HTML - * - * @returns {string} The selected HTML - */ - _getSelectedText: function () { - var text = ''; - var container = this.scope.find('[data-role="commentContent"]').get(0); - - var isChild = function (child, parent) { - if(child === parent){ - return true; - } - - var current = child; - - while (current) { - if(current === parent){ - return true; - } - current = current.parentNode; - } - - return false; - }; - - // http://stackoverflow.com/questions/29038950/get-selected-text-with-a-div-with-arbitrary-nested-divs - if( window.getSelection || document.getSelection ){ - var selection = ( window.getSelection ) ? window.getSelection() : document.getSelection(); - - if( selection.rangeCount > 0 ){ - var range = selection.getRangeAt(0); - var clonedSelection = range.cloneContents().querySelector('[data-role="commentContent"]'); - - if( clonedSelection ){ - text = clonedSelection.innerHTML; - } else { - clonedSelection = range.cloneContents(); - var startNode = selection.getRangeAt(0).startContainer.parentNode; - - if( isChild( startNode, container ) ) { - var div = document.createElement('div'); - div.appendChild( clonedSelection ); - text = div.innerHTML; - } - } - - return text; - } - } else if ( document.selection ){ - return document.selection.createRange().htmlText; - } - - return ''; + this._showQuoteTooltip(); }, /** * Builds & shows the selective quoting tooltip, displaying it just above the user's cursor * - * @param {number} clientX X position of the cursor - * @param {number} clientY Y position of the cursor * @returns {void} */ - _showQuoteTooltip: function (e) { + _showQuoteTooltip: function () { + var selection = ips.utils.selection.getSelection(); + var range = ips.utils.selection.getRange(); var tooltip = this.scope.find('[data-role="inlineQuoteTooltip"]'); - var clientX = e.clientX; - var clientY = e.clientY; - var documentScroll = { - top: $( document ).scrollTop(), - left: $( document ).scrollLeft() - }; - if( !_.isUndefined( e.originalEvent.changedTouches ) && !_.isUndefined( e.originalEvent.changedTouches[0] ) ){ - clientX = e.originalEvent.changedTouches[0].clientX; - clientY = e.originalEvent.changedTouches[0].clientY; + if( !range ){ + return; } - if( !this._selectionCoords.top || !this._selectionCoords.left ){ - this._selectionCoords = { - top: clientY + documentScroll.top, - left: clientX + documentScroll.left - }; - } + // Clone the range, and insert an element containing an invisible character which we'll use + // to fetch the position + var cloneRange = range.cloneRange(); + var invisibleElement = document.createElement('span'); + invisibleElement.appendChild( document.createTextNode('\ufeff') ); + // Collapse the range so that we only care about the end position + cloneRange.collapse(); + + // Insert our invisible element into the range + cloneRange.insertNode( invisibleElement ); + + // Get the position of the invisible element we created + var position = ips.utils.position.getElemPosition( $( invisibleElement ) ); + var scopeOffset = this.scope.offset(); + + // Safari deselects the text when the invisible element is inserted, so in that + // case we need to reapply the ranges. However, doing so stops other browsers working, + // notably iOS. So here we must find (desktop) safari specifically. + + // Update bug #14364: since we switched to showing the tooltip at the end, the code below actually + // flips the behavior on safari, making it unselect the text again. So, we don't want this to run now. + // Preserving for future reference. + /* + var ua = navigator.userAgent.toLowerCase(); + if( ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1 && ua.indexOf('mobile') === -1 ){ + selection.removeAllRanges(); + selection.addRange( cloneRange ); + }*/ + + // Create the new tooltip if needed if( !tooltip.length ){ - // Create the new tooltip this.scope.append( ips.templates.render('core.selection.quote', { - direction: ips.utils.events.isTouchDevice() ? 'bottom' : 'top' + direction: 'bottom'//ips.utils.events.isTouchDevice() ? 'bottom' : 'top' }) ); tooltip = this.scope.find('[data-role="inlineQuoteTooltip"]'); - $( document ).on( 'click', this._clickHandler ); + $( document ).on( 'click dblclick', this._clickHandler ); } - // Get the correct positioning - // Unfortunately we can't use our ips.utils.position utility here because that deals - // with elements, not specific coordinates. - var scopeOffset = this.scope.offset(); - var lineHeight = ips.utils.position.lineHeight( this.scope.find('[data-role="commentContent"]') ); var tooltipSize = { - width: tooltip.show().width(), - height: tooltip.show().height() + width: tooltip.show().outerWidth(), + height: tooltip.show().outerHeight() }; - var tooltipPos = {}; - - // if this is a touch event, we'll position the quote tooltip in the middle of the text, but if it's a mouse - // event we'll position it wherever we lifted the mouse - var useMouseUpPositioning = true; - - if( ( e.originalEvent.type === 'touchend' || e.originalEvent.type === 'touchcancel' ) && ( window.Element && Element.prototype.getBoundingClientRect ) ){ - try { - var selection = ( window.getSelection ) ? window.getSelection() : document.getSelection(); - if( selection.rangeCount > 0 ){ - var range = selection.getRangeAt(0); - var rect = range.getBoundingClientRect(); - - if( rect ){ - tooltipPos = { - left: ( rect.left + ( rect.width / 2 ) + documentScroll.left ) - scopeOffset.left - ( tooltipSize.width / 2 ), - top: ( rect.bottom + documentScroll.top ) - scopeOffset.top - }; - - useMouseUpPositioning = false; - } - } - } catch (err) {} - } - - if( useMouseUpPositioning ){ - tooltipPos = { - left: ( this._selectionCoords.left ) - scopeOffset.left - ( tooltipSize.width / 2 ) - }; - - if( ips.utils.events.isTouchDevice() ){ - tooltipPos = _.extend( tooltipPos, { - top: ( this._selectionCoords.top ) - scopeOffset.top + tooltipSize.height + lineHeight - }); - } else { - tooltipPos = _.extend( tooltipPos, { - top: ( this._selectionCoords.top ) - scopeOffset.top - tooltipSize.height - lineHeight - }); - } - } + // Set the position. On touch devices, move it a little further to the left to avoid the OS's touch handle + var leftAdjustment = ips.utils.events.isTouchDevice() ? tooltipSize.width : ( tooltipSize.width / 2 ); tooltip.css({ position: 'absolute', - left: Math.round( tooltipPos.left ) + "px", - top: Math.round( tooltipPos.top ) + "px" + left: Math.round( position.absPos.left - scopeOffset.left - leftAdjustment ) + 'px', + top: Math.round( position.absPos.top - scopeOffset.top + 25 ) + 'px' }); // If the tooltip isn't already shown, fade it in @@ -25009,12 +26470,9 @@ var escapeRegExp; * @returns {void} */ _hideQuoteTooltip: function () { - $( document ).off( 'click', this._clickHandler ); + $( document ).off( 'click dblclick', this._clickHandler ); + clearInterval( this._quoteTimeout ); this.scope.find('[data-role="inlineQuoteTooltip"]').fadeOut('fast'); - this._selectionCoords = { - top: 0, - left: 0 - }; }, /** @@ -25693,7 +27151,7 @@ var escapeRegExp; }); }(jQuery, _)); ]]>
- max ){ + max = parseInt( commentFeed.attr('data-topicAnswerID') ); + } + + Debug.log("Max comment ID is " + max); + return max; } }); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -27178,354 +28657,7 @@ var escapeRegExp; } }); }(jQuery, _)); - 0 ) { - this._image.css({ top: 0, bottom: 'auto', position: 'absolute' }); - } else { - var containerHeight = this.scope.find('.ipsCoverPhoto_container').outerHeight(); - var imageHeight = this._image.outerHeight(); - - if( ( imageTop + imageHeight ) < containerHeight ){ - this._image.css({ top: 'auto', bottom: 0, position: 'absolute' }); - } - } - } - }); -}(jQuery, _));]]> - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -27731,7 +28863,7 @@ var escapeRegExp; }); }(jQuery, _)); - /** + /** * IPS Social Suite 4 * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -27786,7 +28918,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - = 45 && this._pollMultiplier === 1 ){ // 15 minutes @ 20s poll + if( this._windowInactivePoll >= 3 && this._pollMultiplier === 1 ){ // 0-3 minutes @ 60s poll if( this._debugPolling ){ - Debug.log( "Notifications: Polled over 15 minutes, increasing multiplier to 2"); + Debug.log( "Notifications: Polled over 3 minutes, increasing multiplier to 2"); } this._pollMultiplier = 2; this._setInterval( this._pollTimeout * this._pollMultiplier ); - } else if( this._windowInactivePoll >= 113 && this._pollMultiplier === 2 ) { // 15 minutes @ 20s poll, 45 minutes at 40s poll + } else if( this._windowInactivePoll >= 7 && this._pollMultiplier === 2 ) { // 4-11 minutes @ 120s poll if( this._debugPolling ){ - Debug.log( "Notifications: Polled over 60 minutes, increasing multiplier to 3"); + Debug.log( "Notifications: Polled over 10 minutes, increasing multiplier to 3"); } this._pollMultiplier = 3; this._setInterval( this._pollTimeout * this._pollMultiplier ); - } else if( this._windowInactivePoll >= 233 && this._pollMultiplier === 3 ) { // 15 minutes @ 20s, 45 minutes at 40s poll, 2 hours at 60s poll + } else if( this._windowInactivePoll >= 25 && this._pollMultiplier === 3 ) { // > 60 mins stop if( this._debugPolling ){ - Debug.log( "Notifications: Polled over 3 hours, stopping polling"); + Debug.log( "Notifications: Polled over 60 mins, stopping polling"); } this._stopPolling(); return; @@ -28175,17 +29307,7 @@ var escapeRegExp; // Do we need to play a sound? if( total > 0 ){ - if( !ips.getSetting('disableNotificationSounds') ){ - ips.loader.get( ['core/interface/buzz/buzz.min.js'] ).then( function () { - var sound = new buzz.sound( ips.getSetting('baseURL') + 'applications/core/interface/sounds/notification', { - webAudioApi: true, - formats: [ "mp3" ] - }); - - sound.play(); - }); - } - + ips.utils.notification.playSound(); // Do we need to update the browser title? if( document[ ips.utils.events.getVisibilityProp() ] ){ @@ -28242,7 +29364,7 @@ var escapeRegExp; notifyData = _.extend( notifyData, { title: ips.pluralize( ips.getString( type + 'GeneralMultiple'), [ items.length ] ), body: items[0].title, - icon: ips.getSetting('imgURL') + '/notifyIcons/' + type + '.png', + icon: ips.getSetting( type + '_imgURL'), onClick: function () { // Try and focus the window (security settings may prevent it, though) try { @@ -28328,7 +29450,8 @@ var escapeRegExp; extraClasses: 'cNotificationFlash ipsPad_half', dismissable: function () { self._stopPolling(); - } + }, + escape: false }); } }, @@ -28442,7 +29565,7 @@ var escapeRegExp; } }); }(jQuery, _));]]> - = image.naturalWidth && !$( image ).hasClass('ipsImage_thumbnailed') ) { + if( !_.isUndefined( $( image ).attr('data-emoticon') ) || $( image ).hasClass('ipsEmoji') || image.width >= image.naturalWidth && !$( image ).hasClass('ipsImage_thumbnailed') ) { return; } @@ -28528,7 +29651,7 @@ var escapeRegExp; } }); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -28579,7 +29702,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * IPS Social Suite 4 * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -28626,7 +29749,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - a'); } - // If this is a touch device, and it's already highlighted, then navigate to the li instead - if( ips.utils.events.isTouchDevice() && li.hasClass('ipsNavBar_active') ){ - window.location = link.attr('href'); + // If we're already active and this is a touch device, then allow the browser to navigate to it + if( ips.utils.events.isTouchDevice() && li.hasClass('ipsNavBar_active') ){ return; } @@ -29281,7 +30382,7 @@ var escapeRegExp; } }); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -29325,7 +30426,7 @@ var escapeRegExp; }); }(jQuery, _)); - - = this._maxQuestions ){ + var questions = this.scope.find('[data-questionID]'); + if( questions.length >= this._maxQuestions ){ ips.ui.alert.show( { type: 'alert', icon: 'warn', @@ -29548,7 +30650,7 @@ var escapeRegExp; var self = this; var question = $( e.currentTarget ).closest('[data-questionid]'); var removeQuestion = function () { - question.remove(); + question.replaceWith('
'); self._checkQuestionButton(); }; @@ -29759,7 +30861,7 @@ var escapeRegExp; } }); }(jQuery, _));]]>
- - ') - .attr( 'type', 'hidden' ) - .attr( 'name', i ) - .attr( 'value', val ) - .attr( 'data-role', 'searchFilter' ) - ); - }); - } catch (err) { - form.append( - $('') - .attr( 'type', 'hidden' ) - .attr( 'name', 'type' ) - .attr( 'value', options ) - .attr( 'data-role', 'searchFilter' ) - ); - return; - } - }, - - /** - * Event handler for focusing the search box - * - * @param {event} e Event object - * @returns {void} - */ - focusSearch: function (e) { - var self = this; - var url = ips.getSetting('baseURL') + 'index.php?app=core&module=search&controller=search&do=globalFilterOptions&checked=' + this.scope.attr('data-default'); - - if( this._expanded ){ - return; - } - - $('#elSearch').addClass('cSearchExpanded'); - $('#elSearchFilter').show(); - - if( this.scope.find('[data-role="globalSearchMenuOptions"]').length ){ - ips.getAjax()( url ) - .done(function( response ){ - self.scope.find('[data-role="globalSearchMenuOptions"]').replaceWith( response ); - }); - } - - this._expanded = true; - }, - - /** - * Shrinks search box when blurred. Sets a timer and hands off to _cancelSearch to actually shrink it. - * - * @returns {void} - */ - blurSearch: function () { - var self = this; - - // First set a small timeout so we can cancel this if we want - this._blurTimeout = setTimeout( function (){ - self._cancelSearch(); - }, 500 ); - }, - - /** - * Shrinks search box when blurred. - * - * @param {boolean} loseFocus - * @returns {void} - */ - _cancelSearch: function () { - - if( ips.utils.responsive.currentIs('phone') ){ - ips.utils.anim.go('fadeIn fast', $('#elHeaderNavigation') ); - } - - $('#elSearch') - .removeClass('cSearchExpanded'); - - $('#elSearchFilter').hide(); - - this._expanded = false; - }, - - /** - * Event handler for the filter menu being opened + * Event handler for when the search box loses focus * * @param {event} e Event object * @returns {void} */ - menuOpened: function (e, data) { - Debug.log( data.elemID ); - if( data.elemID == 'elSearchFilter' ){ - clearTimeout( this._blurTimeout ); + closeSearch: function (e, data) { + // This function returns the trigger element that was clicked on, if any + var clickedOnTrigger = function () { + if( $( e.target ).is('#elSearchExpanded') ){ + Debug.log( e.target ); + return $( e.target ); + } else if ( $( e.target ).parent('#elSearchExpanded') ){ + return $( e.target ).parent('#elSearchExpanded').get(0); + } + }(); + + if( clickedOnTrigger || $( e.target ).attr('href') == '#' || $( e.target ).is('label') || $( e.target ).attr('id') == 'elSearchField' || $.contains( $('#elSearchExpanded'), $( e.target ) ) ){ + return true; } + + $( document ).off('click.elSearchExpanded'); + ips.utils.anim.go('fadeOut fast', $('#elSearchExpanded')); + $('#elSearchWrapper').removeClass('cSearchExpanded'); + }, + + /** + * Event handler for when the search box is clicked into + * + * @param {event} e Event object + * @returns {void} + */ + openSearch: function (e, data) { + if ( $('#elSearchExpanded').is(':visible') ) { + return; + } + + ips.utils.anim.go('fadeIn fast', $('#elSearchExpanded')); + $('#elSearchWrapper').addClass('cSearchExpanded'); + $( document ).on('click.elSearchExpanded', this.closeSearch ); + + if( this._moreOptions === null ){ + var url = ips.getSetting('baseURL') + 'index.php?app=core&module=search&controller=search&do=globalFilterOptions&exclude=' + $('[data-action="showMoreSearchContexts"]').attr('data-exclude'); + ips.getAjax()( url ) + .done(function( response ){ + this._moreOptions = response; + }.bind(this)); + } + }, + + /** + * Event handler for the "More Options" lik being clicked + * + * @param {event} e Event object + * @returns {void} + */ + showMoreSearchContexts: function (e, data) { + e.stopPropagation(); + e.preventDefault(); + this.scope.find('[data-role="showMoreSearchContexts"]').replaceWith( this._moreOptions ); } }); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -30023,7 +31019,7 @@ var escapeRegExp; } }); }(jQuery, _)); - = 1 ){ this._reactCount.addClass('ipsAreaBackground_positive'); @@ -30214,7 +31210,8 @@ var escapeRegExp; } // Mobile support - check whether we've activated the flyout first - if( ips.utils.events.isTouchDevice() && !this._reactTypeContainer.hasClass('ipsReact_types_active') ){ + // Or, if this is a single reaction, ignore the flyout and just proceed with reacting + if( ips.utils.events.isTouchDevice() && ( !this._singleReaction && !this._reactTypeContainer.hasClass('ipsReact_types_active') ) ){ return; } @@ -30244,14 +31241,18 @@ var escapeRegExp; reaction.replaceWith( currentButtonCopy.removeClass('ipsReact_active') ); // Show the x button, hide the flyout and remove active styles - self._reactClose.fadeIn(); + setTimeout( function () { + self._reactClose.fadeIn(); + }, 400 ); self.unlaunchReaction(); self._removeActiveReaction(); }; } else { var _complete = function () { // Show the x button, hide the flyout and remove active styles - self._reactClose.fadeIn(); + setTimeout( function () { + self._reactClose.fadeIn(); + }, 400 ); self.unlaunchReaction(); self._removeActiveReaction(); }; @@ -30271,8 +31272,28 @@ var escapeRegExp; .done( function (response) { self._updateReaction( response ); } ) - .fail( function () { + .fail( function (jqXHR, textStatus, errorThrown) { Debug.log('fail'); + + if( !_.isUndefined( jqXHR.responseJSON ) && jqXHR.responseJSON.error == 'react_daily_exceeded' ){ + ips.ui.alert.show( { + type: 'alert', + icon: 'warn', + message: ips.getString('reactDailyExceeded'), + callbacks: {} + }); + } else { + ips.ui.alert.show( { + type: 'alert', + icon: 'warn', + message: ips.getString('reactError'), + callbacks: {} + }); + } + + // Undo all the hard work we did to make the reaction active :( + self._reactButton.removeClass('ipsReact_reacted'); + self._reactClose.remove(); } ); } }, @@ -30288,7 +31309,7 @@ var escapeRegExp; }); }(jQuery, _)); ]]> - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -30502,7 +31523,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - - - /** + /** * IPS Social Suite 4 * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -31650,7 +32671,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -31675,7 +32696,469 @@ var escapeRegExp; } }); }(jQuery, _)); - 0 ) { + this._image.css({ top: 0, bottom: 'auto', position: 'absolute' }); + } else { + var containerHeight = this.scope.find('.ipsCoverPhoto_container').outerHeight(); + var imageHeight = this._image.outerHeight(); + + if( ( imageTop + imageHeight ) < containerHeight ){ + this._image.css({ top: 'auto', bottom: 0, position: 'absolute' }); + } + } + }, + + /** + * Toggles cover photo to full height + * + * @returns {void} + */ + toggleCoverPhoto: function () { + var imageHeight = this._image.outerHeight(); + + if( this._expandedCover == false ) { + this._existingPosition = parseInt( this._image.css('top') ) || 0; + + this.scope.animate({ + height: ( imageHeight + this._existingPosition ) + 'px', + }); + + this._expandedCover = true; + } else { + this.scope.animate({ + height: this._containerHeight + 'px' + }); + + this._expandedCover = false; + } + + this.scope.toggleClass('ipsCoverPhotoMinimal'); + }, + }); +}(jQuery, _));]]> + /** + * Invision Community + * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com + * + * ips.core.cropper.js - Cropping controller + * + * Author: Rikki Tissier + */ +;( function($, _, undefined){ + "use strict"; + + ips.controller.register('core.global.core.cropper', { + + _image: null, + _coords: {}, + + initialize: function () { + this.setup(); + }, + + /** + * Setup method + * + * @returns {void} + */ + setup: function () { + var self = this; + + this._image = this.scope.find('[data-role="profilePhoto"]'); + this._coords = { + topLeftX: this.scope.find('[data-role="topLeftX"]'), + topLeftY: this.scope.find('[data-role="topLeftY"]'), + bottomRightX: this.scope.find('[data-role="bottomRightX"]'), + bottomRightY: this.scope.find('[data-role="bottomRightY"]'), + }; + + this._image.css({ + maxWidth: '100%' + }); + + ips.loader.get( ['core/interface/cropper/cropper.min.js'] ).then( function () { + self._image.imagesLoaded( _.bind( self._startCropper, self ) ); + }); + }, + + /** + * Starts the cropping function, called after the image has loaded + * + * @returns {void} + */ + _startCropper: function () { + var self = this; + + var width = this._image.width(); + var height = this._image.height(); + + // Resize the wrapper + this._image.closest('[data-role="cropper"]').css({ + width: width + 'px', + height: height + 'px' + }); + + // Initialize cropper + var cropper = new Cropper( this._image.get(0), { + aspectRatio: 1 / 1, + autoCropArea: 0.9, + responsive: true, + zoomOnWheel: false, + crop: function ( e ) { + self._coords.topLeftX.val( e.detail.x ); + self._coords.topLeftY.val( e.detail.y ); + self._coords.bottomRightX.val( e.detail.width + e.detail.x ); + self._coords.bottomRightY.val( e.detail.height + e.detail.y ); + } + }); + } + }); +}(jQuery, _)); + - /** + * IPS Social Suite 4 + * (c) 2018 Invision Power Services - http://www.invisionpower.com + * + * ips.core.embeddedVideo.js - Simple controller to swap an embedded video out for the link if the source is not supported + * + * Author: Mark Wade + */ +;( function($, _, undefined){ + "use strict"; + + ips.controller.register('core.global.core.embeddedvideo', { + + initialize: function () { + + var video = $(this.scope).get(0); + var canPlay = false; + + if ( !ips.getSetting('adsess') ) { // In the ACP assume we can't play videos because the munging will break external ones. @todo remove this once we fix that + $(this.scope).find('source').each(function(){ + if ( video.canPlayType( $(this).attr('type') ) ) { + console.log(video.canPlayType( $(this).attr('type') )); + canPlay = true; + } + }); + } + + if ( !canPlay ) { + if( $(this.scope).find('embed').length ) + { + $(this.scope).replaceWith( $(this.scope).find('embed') ); + } + else + { + $(this.scope).replaceWith( $(this.scope).find('a') ); + } + } + } + + }); +}(jQuery, _)); + /** + * IPS Social Suite 4 + * (c) 2013 Invision Power Services - http://www.invisionpower.com + * + * ips.core.framebust.js - Frame Busting + * + * Author: Mark Wade + */ +;( function($, _, undefined){ + "use strict"; + + ips.controller.register('core.global.core.framebust', { + + initialize: function () { + if ( top != self ) { + $(this.scope).html(''); + } + } + + }); +}(jQuery, _)); + - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -32311,7 +33862,36 @@ var escapeRegExp; } }); }(jQuery, _)); - ").attr({ + name: $(e.currentTarget).attr('name'), + value: $(e.currentTarget).attr('value') + }) + ); + } + } + }); +}(jQuery, _));]]> + - ').html( this.scope.contents() ).hide(); + this.scope.html( div ); + this.scope.append( ips.templates.render('core.autocomplete.optional') ); + + // Get the options the autocomplete uses + if( this._autoComplete.attr('data-ipsAutocomplete-freeChoice') && this._autoComplete.attr('data-ipsAutocomplete-freeChoice') == 'false' ){ + this._closedTagging = true; + } + }, + + /** + * Toggles showing the autocomplete field + * + * @returns {void} + */ + showAutocomplete: function (e) { + if( e ){ + e.preventDefault(); + } + + var self = this; + var autoCompleteObj = ips.ui.autocomplete.getObj( this._autoComplete ); + + this.scope.find('[data-action="showAutocomplete"]').hide(); + this.scope.find('[data-role="autoCompleteWrapper"]').show(); + + setTimeout( function () { + if( self._closedTagging ){ + self.scope.find('[data-action="addToken"]').click(); + } else { + autoCompleteObj.focus(); + } + }, 100); + } + }); +}(jQuery, _));]]> + - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -33091,7 +34755,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - ').attr('type', 'hidden').attr('name', 'emoticons_squashed'); + + // JSON encode the data + Debug.log("Before encoding, emoticon data is:"); + Debug.log( output ); + output = JSON.stringify( output ); + + this.scope.prepend( newInput.val( output ) ); + + // Disable all of the elements we squashed so that they don't get sent + formElements.prop('disabled', true); + }, /** * Checks typed entry to ensure it is valid (no spaces) @@ -33479,7 +35170,7 @@ var escapeRegExp; }); }(jQuery, _)); ]]> - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -33825,7 +35516,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + + this.next(); + break; + case 37: // <- + this.prev(); + break; + } + }, + + /** + * Close the popup + * + * @returns {void} + */ + close: function (e) { + if( e ){ + e.preventDefault(); + } + + this._popupActive = false; + + this._container.animate({ + transform: "scale(0.7)", + opacity: 0 + }, 'fast'); + + ips.utils.anim.go('fadeOut', this._modal); + }, + + /** + * Handles animating from one card to another in a given direction + * + * @returns {void} + */ + _animate: function (from, to, dir) { + // Set up position of next, and show it (invisible though) + to.css({ + transform: dir == 'forward' ? "translateX(100px)" : "translateX(-100px)", + opacity: 0 + }).show(); + + // Is there another next card available? If not, we need to hide the next button now + this._next.toggle( !!to.next().length ); + this._prev.toggle( !!to.prev().length ); + + // Move current card out + from.stop(true, true).animate({ + transform: dir == 'forward' ? "translateX(-100px)" : "translateX(100px)", + opacity: 0 + }, function () { + from.hide() + }); + + // Move new card in + to.stop(true, true).animate({ + transform: "translateX(0)", + opacity: 1 + }); + + this._active = this._cards.index( to ); + + // Highlight dot + this._dots.removeClass('acpNewFeature_active'); + this._dots.eq( this._active ).addClass('acpNewFeature_active'); + }, + + /** + * Event handler for clicking on one of the dots + * + * @returns {void} + */ + dot: function (e) { + if( e ){ + e.preventDefault(); + } + + var dot = $( e.currentTarget ).parent(); + var idx = this._dots.index( dot ); + + Debug.log( 'idx: ' + idx ); + + var current = this._cards.eq( this._active ); + var next = this._cards.eq( idx ); + var dir = 'forward'; + + if( idx < this._active ){ + dir = 'backward'; + } + + if( idx == this._active ){ + return; + } + + this._animate( current, next, dir ); + }, + + /** + * Event handler for clicking Next + * + * @returns {void} + */ + next: function (e) { + if( e ){ + e.preventDefault(); + } + + var current = this._cards.eq( this._active ); + var next = current.next(); + + if( !next.length ){ + Debug.log('no next'); + return; + } + + this._animate( current, next, 'forward' ); + }, + + /** + * Event handler for clicking Prev + * + * @returns {void} + */ + prev: function (e) { + if( e ){ + e.preventDefault(); + } + + var current = this._cards.eq( this._active ); + var prev = current.prev(); + + if( !prev.length ){ + Debug.log('no prev'); + return; + } + + this._animate( current, prev, 'backward' ); + }, + + /** + * Builds the popup + * + * @returns {void} + */ + _buildPopup: function () { + var cards = []; + var dots = []; + + this._modal = ips.ui.getModal(); + + _.each( this._data, function (item) { + cards.push( ips.templates.render('newFeatures.card', { + title: item.title, + image: item.image, + description: item.description, + moreInfo: item.more_info || false + })); + }); + + for( var i = 0; i < cards.length; i++ ){ + dots.push( ips.templates.render('newFeatures.dot', { + i: i + })); + } + + var container = ips.templates.render('newFeatures.wrapper', { + cards: cards.join(''), + dots: dots.join('') + }); + + $('body').append( container ); + this._container = $('body').find('[data-role="newFeatures"]').css({ opacity: 0.001, transform: "scale(0.8)" }); + this._cards = this._container.find('[data-role="card"]'); + this._dots = this._container.find('[data-role="dots"] [data-role="dot"]'); + this._next = this._container.find('[data-action="nextFeature"]').hide(); + this._prev = this._container.find('[data-action="prevFeature"]').hide(); + + $( document ).trigger('contentChange', [this._container]); + this._modal.on( 'click', this._closeModal.bind( this ) ); + }, + + /** + * Close the modal upon clicking + * + * @returns {void} + */ + _closeModal: function (e) { + e.preventDefault(); + + this.close(); + }, + + /** + * Shows the popup + * + * @returns {void} + */ + _showPopup: function () { + var self = this; + + // Hide all except the first item + this._cards.not(':first').hide(); + this._active = 0; + + // Mark the first dot + this._dots.first().addClass('acpNewFeature_active'); + + if( this._data.length > 1 ){ + this._next.show(); + } + + this._modal.css( { zIndex: ips.ui.zIndex() } ); + ips.utils.anim.go('fadeIn', this._modal); + + // Style the title so we can animate it in momentarily + var title = self._container.find('[data-role="mainTitle"]'); + title.css({ + transform: "scale(1.2)", + opacity: 0 + }); + + this._popupActive = true; + + // Animate the card in + setTimeout( function () { + self._container.css( { zIndex: ips.ui.zIndex() } ); + self._container.animate({ + opacity: 1, + transform: "scale(1)" + }, 'fast'); + }, 500); + + // Now animate the title in + setTimeout( function () { + title.animate({ + opacity: 1, + transform: "scale(1)" + }, 'fast'); + }, 800); + + } + }); +}(jQuery, _)); + + +]]> + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -34179,7 +36227,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + * IPS Social Suite 4 + * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com + * + * ips.editor.codePreview.js - Codemirror preview panel + * + * Author: Mark Wade + */ +;( function($, _, undefined){ + "use strict"; + + ips.controller.register('core.global.editor.codePreview', { + + _origin: '', + + initialize: function () { + this.on( 'click', '[data-action="preview"]', this.fetchPreview ); + }, + + fetchPreview: function (data) { + var scope = $(this.scope); + $('#' + scope.attr('data-name') + '_preview').addClass('ipsLoading').html(''); + ips.getAjax()( scope.attr('data-preview-url'), { + type: 'POST', + data: { + 'value': scope.find('textarea').data('CodeMirrorInstance').getValue() + } + } ).done( function (response) { + $('#' + scope.attr('data-name') + '_preview').removeClass('ipsLoading').html( response ); + }); + } + }); +}(jQuery, _)); + - 7 ){ - existing.splice( ( existing.length - 7 ) * -1, existing.length - 7 ); - } - - ips.utils.db.set( 'emoticons', 'recent', existing ); + if( emojiForThisRow ){ + categoryHtml += ips.templates.render('core.editor.emoticonRow', { emoticons: emojiForThisRow } ); + } + if ( categoryHtml ) { + finalHtml += ips.templates.render('core.editor.emoticonCategory', { title: ips.getString( 'emoji-category-recent' ), categoryID: category, emoticons: categoryHtml } ); + categoryHtml = ''; + emojiForThisRow = ''; + } + } + if ( newRecentlyUsed != recentlyUsed ) { + ips.utils.cookie.set( 'recentEmoji', newRecentlyUsed.join(','), true ); + } + } + + /* Loop all the emoji categories */ + for ( var category in emoji ) { + var categoryCount = 0; + + /* Loop each emoji... */ + for ( var i = 0; i < emoji[category].length; i++ ) { + + /* Include in search results? */ + if ( search ) { + var match = false; + if ( emoji[category][i].name.match( search ) ) { + match = true; + } + if ( !match && emoji[category][i].shortNames ) { + for ( var j = 0; j < emoji[category][i].shortNames.length; j++ ) { + if ( emoji[category][i].shortNames[j].match( search ) ) { + match = true; + } + } + } + if ( !match && emoji[category][i].ascii ) { + for ( var j = 0; j < emoji[category][i].ascii.length; j++ ) { + if ( emoji[category][i].ascii[j].match( search ) ) { + match = true; + } + } + } + if ( !match ) { + continue; + } + } + + /* Get which code we'll use */ + var codeToUse = emoji[category][i].code; + if ( emoji[category][i].skinTone && tone && tone != 'none' ) { + codeToUse = ips.utils.emoji.tonedCode( codeToUse, tone ); + } + + /* Display */ + emojiForThisRow += ips.templates.render('core.editor.emoji', { + display: ips.utils.emoji.preview( codeToUse ), + name: ips.haveString( 'emoji-' + emoji[category][i].name ) ? ips.getString( 'emoji-' + emoji[category][i].name ) : emoji[category][i].name, + code: codeToUse + } ); + + /* Once we've reached the limit per line, add the line */ + pos++; + categoryCount++; + if( pos == 8 ) { + categoryHtml += ips.templates.render('core.editor.emoticonRow', { emoticons: emojiForThisRow } ); + pos = 0; + emojiForThisRow = ''; + } + } + + /* Add the HTML */ + if ( !search ) { + if( pos ){ + categoryHtml += ips.templates.render('core.editor.emoticonRow', { emoticons: emojiForThisRow } ); + } + if ( categoryHtml ) { + var categoryTitle = ['smileys_people','animals_nature','food_drink','activities','travel_places','objects','symbols','flags'].indexOf(category) == -1 ? emoji[category][0].categoryName : ips.getString( 'emoji-category-' + category ); + + finalHtml += ips.templates.render('core.editor.emoticonCategory', { title: categoryTitle, categoryID: category, emoticons: categoryHtml } ); + categoryHtml = ''; + pos = 0; + emojiForThisRow = ''; + + menuContent.push( ips.templates.render('core.editor.emoticonMenu', { + title: categoryTitle, + count: categoryCount, + categoryID: category + })); + } + } + } + if ( search ) { + $( this.scope ).find('[data-role="categoryTrigger"]').hide(); + if( pos ){ + categoryHtml += ips.templates.render('core.editor.emoticonRow', { emoticons: emojiForThisRow } ); + } + if ( categoryHtml ) { + finalHtml = ips.templates.render('core.editor.emoticonSearch', { emoticons: categoryHtml } ); + } else { + finalHtml = ips.templates.render('core.editor.emoticonNoResults'); + } + } else { + $( this.scope ).find('[data-role="categoryTrigger"]').show(); + $( this.scope ).find('[data-role="categoryMenu"]').html( menuContent.join('') ); + } + + /* Display */ + this.scope.find('.ipsMenu_innerContent').html( finalHtml ); + + /* Show the skin tone indicator */ + if ( ips.getSetting('emoji_style') != 'disabled' && ( ips.getSetting('emoji_style') != 'native' || ips.utils.emoji.canRender( '1F44D-1F3FB' ) ) ) { + this.scope.find("[data-role='skinToneMenu']").show(); + switch ( tone ) { + case 'light': + this.scope.find("[data-role='skinToneIndicator']").text( String.fromCodePoint( parseInt( '1F44D', 16 ) ) + String.fromCodePoint( parseInt( '1F3FB', 16 ) ) ); + break; + case 'medium-light': + this.scope.find("[data-role='skinToneIndicator']").text( String.fromCodePoint( parseInt( '1F44D', 16 ) ) + String.fromCodePoint( parseInt( '1F3FC', 16 ) ) ); + break; + case 'medium': + this.scope.find("[data-role='skinToneIndicator']").text( String.fromCodePoint( parseInt( '1F44D', 16 ) ) + String.fromCodePoint( parseInt( '1F3FD', 16 ) ) ); + break; + case 'medium-dark': + this.scope.find("[data-role='skinToneIndicator']").text( String.fromCodePoint( parseInt( '1F44D', 16 ) ) + String.fromCodePoint( parseInt( '1F3FE', 16 ) ) ); + break; + case 'dark': + this.scope.find("[data-role='skinToneIndicator']").text( String.fromCodePoint( parseInt( '1F44D', 16 ) ) + String.fromCodePoint( parseInt( '1F3FF', 16 ) ) ); + break; + default: + this.scope.find("[data-role='skinToneIndicator']").text( String.fromCodePoint( parseInt( '1F44D', 16 ) ) ); + break; } } }, - + /** - * Converts the recent emoticons cookie to localStorage + * Event handler called when the skin tone is change * + * @param {event} e Event object + * @param {object} data Event data object * @returns {void} */ - _convertEmoticonsToLocalStorage: function () { - var emoticonCookie = ips.utils.cookie.get('recentEmoticons'); - var existing = []; + changeSkinTone: function (e, data) { + ips.utils.emoji.getEmoji(function(emoji){ + this._buildEmoji( emoji, data.selectedItemID, this._lastVal ? new RegExp( this._lastVal.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&" ), 'i' ) : null ); + }.bind(this)); + ips.utils.cookie.set( 'emojiSkinTone', data.selectedItemID, true ); + }, + + /* !Search */ - if( !ips.utils.db.isEnabled() ){ - return; - } - - if( !_.isUndefined( emoticonCookie ) && emoticonCookie !== '-' ){ - try { - existing = $.parseJSON( emoticonCookie ); - } catch(err) { - Debug.log( err ); - } - - ips.utils.db.set( 'emoticons', 'recent', existing ); - ips.utils.cookie.set('recentEmoticons', '-', true); - ips.utils.cookie.unset('recentEmoticons'); + _typeTimer: null, + _lastVal: '', + + /** + * Event handler called when the emoticons menu is opened. + * Iniializes the menu if it hasn't already been done + * + * @param {event} e Event object + * @param {object} data Event data object + * @returns {void} + */ + menuOpened: function (e, data) { + if( data.menu.attr('data-controller') == 'core.global.editor.emoticons' ){ + setTimeout(function(){ + this.scope.find('[data-role="emoticonSearch"]').focus(); + }.bind(this),100); } }, @@ -34574,15 +36782,6 @@ var escapeRegExp; * @returns {void} */ searchEmoticons: function (e) { - // Find the last-active panel. If search is the last active (because we blurred then - // came back), then just carry on without rememberig it - var lastActive = this.scope.find('[data-panel]:visible').attr('data-panel'); - - if( lastActive != 'search' ){ - this._lastActive = lastActive; - } - - // Set a continuous timer this._typeTimer = setInterval( _.bind( this._typing, this ), 200 ); }, @@ -34627,16 +36826,9 @@ var escapeRegExp; * @returns {void} */ _clearSearch: function () { - if( this.scope.find('[data-panel="search"]') ){ - this.scope.find('[data-panel="search"]').remove(); - - // Display the previous panel - if( !this._lastActive ){ - this._lastActive = 'overview'; - } - - this.scope.find('[data-panel="' + this._lastActive + '"]').show(); - } + ips.utils.emoji.getEmoji(function(emoji){ + this._buildEmoji( emoji, ips.utils.cookie.get('emojiSkinTone') ); + }.bind(this)); }, /** @@ -34646,89 +36838,13 @@ var escapeRegExp; * @returns {void} */ _doSearch: function (value) { - var panel = this._getSearchPanel(); - var matchEmoticons = []; - - for( var cat in this._emoticonsObj ){ - var catLength = this._emoticonsObj[cat].emoticons.length; - - // Loop through each emoticon, and do a very simple indexOf search on the - // src and text properties - for( var i = 0; i < catLength; i++ ){ - if( this._emoticonsObj[cat].emoticons[i].src.indexOf( value ) !== -1 || - this._emoticonsObj[cat].emoticons[i].text.indexOf( value ) !== -1 ){ - matchEmoticons.push( { - src: this._emoticonsObj[cat].emoticons[i].src, - text: this._emoticonsObj[cat].emoticons[i].text - }); - } - } - } - - if( !matchEmoticons.length ){ - panel.html( ips.templates.render('core.editor.emoticonNoResults') ); - } else { - var rows = this._buildEmoticonRows( matchEmoticons ); - - var content = ips.templates.render('core.editor.emoticonCategory', { - emoticons: rows.join(''), - title: ips.getString('emoticonSearch'), - categoryID: 'search' - }); - - panel.html( ips.templates.render('core.editor.emoticonSection', { - content: content, - id: 'search' - })); - } + ips.utils.emoji.getEmoji(function(emoji){ + this._buildEmoji( emoji, ips.utils.cookie.get('emojiSkinTone'), new RegExp( value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&" ), 'i' ) ); + }.bind(this)); }, - - /** - * Gets the search results panel, or builds it - * - * @returns {element} - */ - _getSearchPanel: function () { - var panel = this.scope.find('[data-panel="search"]'); - - if( !panel.length ){ - this.scope - .find('.ipsMenu_innerContent') - .append( ips.templates.render('core.editor.emoticonSection', { - content: '', - id: 'search' - })); - - panel = this.scope.find('[data-panel="search"]'); - - // Now hide all panels, then fade in the one we want - this.scope.find('[data-panel]').hide(); - ips.utils.anim.go( 'fadeIn', this.scope.find('[data-panel="search"]') ); - } - - return panel; - }, - - /** - * Event handler called when the emoticons menu is opened. - * Iniializes the menu if it hasn't already been done - * - * @param {event} e Event object - * @param {object} data Event data object - * @returns {void} - */ - menuOpened: function (e, data) { - if( data.elemID == 'elEmoticons' ){ - data.originalEvent.preventDefault(); - - // Do we need to init? - if( !this._doneInit ){ - this._buildEmoticonsPanel(); - this._buildOverview(); - } - } - }, - + + /* !Categories */ + /** * Event handler called when the a category is selected * @@ -34737,268 +36853,15 @@ var escapeRegExp; * @returns {void} */ changeCategory: function (e, data) { - - if( !$.contains( this.scope.get(0), data.triggerElem ) ){ - return; - } - - data.originalEvent.preventDefault(); - e.stopPropagation(); - - var categoryID = data.selectedItemID || false; - - // See if we've got an invalid ID for some reason - if( categoryID === false || ( categoryID != 'overview' && !this._emoticonsObj[ categoryID ] ) ){ - return; - } - - // Already showing this one? - if( this.scope.find('[data-panel="' + categoryID + '"]').is(':visible') ){ - return; - } - - // If the panel doesn't already exist, build it - if( !this.scope.find('[data-panel="' + categoryID + '"]').length ){ - var primaryContent = ''; - var rows = this._buildEmoticonRows( this._emoticonsObj[ categoryID ].emoticons ); - - primaryContent = ips.templates.render( 'core.editor.emoticonCategory', { - emoticons: rows.join(''), - title: this._emoticonsObj[ categoryID ].title, - categoryID: categoryID - }); - - this.scope - .find('.ipsMenu_innerContent') - .append( ips.templates.render('core.editor.emoticonSection', { - content: primaryContent, - id: categoryID - })); - } - - // Now hide all panels, then fade in the one we want - this.scope.find('[data-panel]').hide(); - ips.utils.anim.go( 'fadeIn', this.scope.find('[data-panel="' + categoryID + '"]') ); - }, - - /** - * Called by the initialization function. Sets up the panel, building the initial overview - * list and compiling templates we'll need later. - * - * @returns {void} - */ - _buildEmoticonsPanel: function () { - - // Build the categories menu - var menuContent = []; - - for( var cat in this._emoticonsObj ){ - menuContent.push( ips.templates.render('core.editor.emoticonMenu', { - title: this._emoticonsObj[ cat ].title, - count: this._emoticonsObj[ cat ].total, - categoryID: cat - })); - } - - $( this.scope ).find('[data-role="categoryMenu"]').append( menuContent.join('') ); - - // Mark as done - this._doneInit = true; - }, - - _getJSON: function () { - var deferred = $.Deferred(); - var self = this; - - // If there's already a request going, abort it - if( this._ajaxObj && this._ajaxObj.abort ){ - this._ajaxObj.abort(); - } - - this._ajaxObj = ips.getAjax(); - - // Set loading to true - this._setLoading(); - - this._ajaxObj( ips.getSetting('baseURL') + 'index.php?app=core&module=system&controller=editor&do=emoticons', { - dataType: 'json' - }) - .done( function (emoticons) { - ips.setSetting('emoticons', emoticons); - self._emoticonsObj = emoticons; - deferred.resolve(); - }) - .fail( function () { - deferred.reject(); - }) - .always( function () { - self._setLoadingDone(); - }); - - return deferred.promise(); - }, - - /** - * Sets the panel as loading - adds a loading thingy, disables the search box - * and hides the category menu - * - * @returns {void} - */ - _setLoading: function () { - this.scope - .find('[data-panel="loading"]') - .remove() - .end() - .find('.ipsMenu_innerContent') - .append( ips.templates.render('core.editor.emoticonSection', { - content: '', - id: 'loading' - })) - .find('[data-panel="loading"]') - .css( { height: '150px' } ) - .addClass('ipsLoading') - .end() - .end() - .find('[data-role="emoticonSearch"]') - .prop('disabled', true) - .end() - .find('[data-role="categoryTrigger"]') - .hide(); - }, - - /** - * Removes the loading state - removes loading thing, enabled textbox, shows category menu - * - * @returns {void} - */ - _setLoadingDone: function () { - this.scope - .find('[data-panel="loading"]') - .remove() - .end() - .find('[data-role="emoticonSearch"]') - .prop('disabled', false) - .end() - .find('[data-role="categoryTrigger"]') - .show(); - }, - - /** - * Fills the overview panel with up to 21 emoticons from each category - * - * @returns {void} - */ - _buildOverview: function () { - - // 09/09/15 - 4.1 - Converting this cookie to use localStorage to avoid a mod_security issue - // @todo remove in a future release - this._convertEmoticonsToLocalStorage(); - - var primaryContent = []; - var recentlyUsed = ips.utils.db.get('emoticons', 'recent' ); - - if( recentlyUsed ){ - var rows = this._buildEmoticonRows( recentlyUsed, 7 ); - - primaryContent.push( ips.templates.render('core.editor.emoticonCategory', { - emoticons: rows.join(''), - title: ips.getString('emoticonRecent'), - categoryID: 'recent' - })); - } - - // Build the emoticons - // Loop through each category, then loop through each emoticon in each - for( var cat in this._emoticonsObj ){ - var rows = this._buildEmoticonRows( this._emoticonsObj[ cat ].emoticons, 21 ); - - primaryContent.push( ips.templates.render('core.editor.emoticonCategory', { - emoticons: rows.join(''), - title: this._emoticonsObj[ cat ].title, - categoryID: cat - })); - } - - this.scope - .find('.ipsMenu_innerContent') - .html( ips.templates.render('core.editor.emoticonSection', { - content: primaryContent.join(''), - id: 'overview' - })); - }, - - /** - * Given an array of emoticons, builds rows of emoticons for panels, up to the maximum number of - * emoticons specified - * - * @param {array} emoticons Array of emoticon data - * @param {number} max Max number of emoticons to show. Shows all if not specified - * @returns {array} Array of rows, ready to be joined as a string - */ - _buildEmoticonRows: function (emoticons, max) { - if( !max ){ - max = emoticons.length; - } - - var thisCategory = []; - var emoticonArray = []; - var pos = 0; - - for( var i = 0; i < max; i++ ){ - if( pos == 0 && _.isUndefined( emoticons[ i ] ) ){ - break; - } - - if( !_.isUndefined( emoticons[ i ] ) ){ - /* The user may have an emoticon cookie that doesn't contain these new items */ - var opts = { - "srcset": !_.isUndefined( emoticons[i].srcset ) ? emoticons[i].srcset : '', - "width": !_.isUndefined( emoticons[i].width ) ? emoticons[i].width : 'auto', - "height": !_.isUndefined( emoticons[i].height ) ? emoticons[i].height : 'auto' - }; - - emoticonArray.push( ips.templates.render('core.editor.emoticonItem', { - tag: emoticons[i].text, - src: emoticons[i].src, - srcset: ( opts.width !== 'auto' && opts.height !== 'auto' ) ? opts.srcset : '', - width: opts.width, - height: opts.height, - img: "" - })); - - this._testEmoticon( emoticons[i].src ); - } else { - emoticonArray.push( ips.templates.render('core.editor.emoticonBlank') ); - } - - pos++; - - if( pos == 7 || ( i + 1 ) == max ){ - thisCategory.push( ips.templates.render('core.editor.emoticonRow', { emoticons: emoticonArray.join('') }) ); - pos = 0; - emoticonArray = []; - } - } - - return thisCategory; - }, - - /** - * Test if an image actually exists before adding it to the array - * - * @param {string} emoticon Emoticon URL - */ - _testEmoticon: function( emoticon ) { - var image = new Image(); - var noerror = true; - image.onerror = function(){ - $('[data-src="' + emoticon + '"]').remove(); - } - image.src = emoticon; - } + this.scope.find('.ipsMenu_innerContent').animate({ + scrollTop: this.scope.find('.ipsMenu_innerContent').scrollTop() + this.scope.find('[data-categoryid="' + data.selectedItemID + '"]').position().top - 85 + }, 250); + } + }); + }(jQuery, _));]]> - - ').attr({ + 'class': 'ipsEmbeddedVideo', + 'data-controller': 'core.global.core.embeddedvideo', + 'data-fileid': item.fileID, + 'data-unique': Math.random().toString(36).substr(2, 9) + }); + + var sourceElement = $('').attr({ + 'src': item.fullImage, + 'type': item.mimeType + }); + element.append( sourceElement ); + + var fallbackLink = $('').addClass('ipsAttachLink').attr( 'href', ips.getSetting('baseURL') + 'applications/core/interface/file/attachment.php?id=' + item.fileID ).html( item.title ); + element.append( fallbackLink ); + } else { element = $('').addClass('ipsAttachLink').html( item.title ); @@ -35507,7 +37392,7 @@ var escapeRegExp; } }); }(jQuery, _));]]> - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -35724,7 +37609,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -36183,7 +38071,78 @@ var escapeRegExp; } }); }(jQuery, _)); - 1 ) ? ips.pluralize( ips.getString( 'delete_confirm_many' ), count ) : ips.getString('delete_confirm'), + callbacks: { + ok: function () { + $( document ).trigger('moderationSubmitted'); + self._bypassDeleteCheck = true; + self.scope.find('[data-role="moderationTools"]').submit(); + } + } + }); + } + }); +}(jQuery, _));]]> + - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -36331,7 +38290,7 @@ var escapeRegExp; // Show confirmation ips.ui.flashMsg.show( ips.getString('addedIgnore', { - user: _.escape( response.name ) + user: response.name }) ); @@ -36390,7 +38349,7 @@ var escapeRegExp; }); }(jQuery, _)); - - /** + * Invision Community + * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com + * + * ips.members.history.js - Filters for member history log + * + * Author: Mark Wade + */ + +;( function($, _, undefined){ + "use strict"; + + ips.controller.register('core.admin.members.history', { + + initialize: function () { + this.on( 'menuItemSelected', this.filterSelected ); + }, + + /** + * Event handler for when a filter option is chosen + * + * @param {event} e Event object + * @param {object} data Event data object + * @returns {void} + */ + filterSelected: function (e, data) { + if( data.originalEvent ){ + data.originalEvent.preventDefault(); + } + + if( data.triggerID == 'memberHistoryFilters' ){ + $(this.scope).find('[data-role="historyTitle"]').text( data.menuElem.find('[data-ipsMenuValue="' + data.selectedItemID + '"]').text() ); + $(this.scope).find('[data-role="historyDisplay"]').addClass('ipsLoading ipsLoading_dark').html(''); + + ips.getAjax()( data.menuElem.find('[data-ipsMenuValue="' + data.selectedItemID + '"] a').attr('href') ).done(function(response){ + $(this.scope).find('[data-role="historyDisplay"]').html( response ).removeClass('ipsLoading ipsLoading_dark'); + $( document ).trigger( 'contentChange', [ this.scope ] ); + }.bind(this)); + } + } + + }); +}(jQuery, _)); + /** + * Invision Community + * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com + * + * ips.core.members.lazyLoadingProfileBlock.js + * + * Author: Mark Wade + */ +;( function($, _, undefined){ + "use strict"; + + ips.controller.register('core.admin.members.lazyLoadingProfileBlock', { + + /** + * Init + */ + initialize: function () { + var scope = $(this.scope); + ips.getAjax()( scope.attr('data-url') ).done(function(response){ + scope.html( response ); + $( document ).trigger( 'contentChange', [ scope ] ); + }); + }, + + }); +}(jQuery, _)); + - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -36851,7 +38885,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -36897,7 +38931,7 @@ var escapeRegExp; } }); }(jQuery, _)); - form').attr('action'); + + this._infScrollURL = this.scope.attr('data-ipsInfScroll'); + this.scope.attr('data-ipsInfScroll-url', base + '&' + params + '&folder=' + this._currentFolder ); + this.scope.trigger('refresh.infScroll'); + } + $( document ).trigger( 'contentChange', [ this._messageList ] ); this._resetListActions(); }, @@ -37540,7 +39588,6 @@ var escapeRegExp; var gotSomething = false; _.each( [ 'topic', 'post', 'recipient', 'sender' ], function( item ) { - Debug.log(item); if ( _.has( serialized.search, item ) ) { gotSomething = true; } @@ -37560,14 +39607,13 @@ var escapeRegExp; } } }); - } - else { + } else { this.trigger('searchFolder.messages', _.extend( { folder: this._currentFolder }, serialized ) ); } }, - + /** * Resets changes made for searching * @@ -37587,6 +39633,10 @@ var escapeRegExp; // Reset page actions this._resetListActions(); + + // Reset infinite scroll url + this.scope.attr('data-ipsInfScroll', this._infScrollURL); + this.scope.trigger('refresh.infScroll'); }, /** @@ -37680,7 +39730,7 @@ var escapeRegExp; } }); }(jQuery, _));]]> - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -38860,7 +40910,7 @@ var escapeRegExp; }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -38958,7 +41008,7 @@ var escapeRegExp; }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -39002,7 +41052,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -39041,7 +41091,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -39220,81 +41289,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** - * Invision Community - * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com - * - * ips.profile.cropper.js - Cropping controller - * - * Author: Rikki Tissier - */ -;( function($, _, undefined){ - "use strict"; - - ips.controller.register('core.front.profile.cropper', { - - _image: null, - _coords: {}, - - initialize: function () { - this.setup(); - }, - - /** - * Setup method - * - * @returns {void} - */ - setup: function () { - var self = this; - - this._image = this.scope.find('[data-role="profilePhoto"]'); - this._coords = { - topLeftX: this.scope.find('[data-role="topLeftX"]'), - topLeftY: this.scope.find('[data-role="topLeftY"]'), - bottomRightX: this.scope.find('[data-role="bottomRightX"]'), - bottomRightY: this.scope.find('[data-role="bottomRightY"]'), - }; - - ips.loader.get( ['core/interface/cropper/cropper.min.js'] ).then( function () { - self._image.imagesLoaded( _.bind( self._startCropper, self ) ); - }); - }, - - /** - * Starts the cropping function, called after the image has loaded - * - * @returns {void} - */ - _startCropper: function () { - var self = this; - - var width = this._image.width(); - var height = this._image.height(); - - // Resize the wrapper - this._image.closest('[data-role="cropper"]').css({ - width: width + 'px', - height: height + 'px' - }); - - // Initialize cropper - this._image.cropper({ - aspectRatio: 1 / 1, - autoCropArea: 0.9, - minContainerWidth: width, - minContainerHeight: height, - crop: function (data) { - self._coords.topLeftX.val( data['x'] ); - self._coords.topLeftY.val( data['y'] ); - self._coords.bottomRightX.val( data['width'] + data['x'] ); - self._coords.bottomRightY.val( data['height'] + data['y'] ); - } - }); - } - }); -}(jQuery, _)); - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -39669,7 +41664,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -39970,7 +42015,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - ' + "$2 " + '' ) ).replace( new RegExp("<mark class="ipsMatch" + ( index + 1 ) + "">", 'ig'), "" ).replace( new RegExp("</mark>", 'ig'), "" ) ); + console.log($( this ).text()); + + + $( this ).replaceWith( _.escape( XRegExp.replace( $( this ).text(), new RegExp( "(\\b|\\s|^)(" + term + "\\w*)(\\b|\\s|$)", "ig" ), '' + "$2 " + '' ) ).replace( new RegExp("<mark class="ipsMatch" + ( index + 1 ) + "">", 'ig'), "" ).replace( new RegExp("</mark>", 'ig'), "" ) ); } ); }); }); } }); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -41000,7 +43048,52 @@ var escapeRegExp; }); }(jQuery, _)); - /** + * Invision Community + * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com + * + * ips.system.api.js - API Docs controller + * + * Author: Rikki Tissier + */ +;( function($, _, undefined){ + "use strict"; + + ips.controller.register('core.admin.stats.filtering', { + + initialize: function () { + this.on( 'click', '[data-role="toggleGroupFilter"]', this.toggleGroupFilter ); + + // And hide by default + if( $('#elGroupFilter').attr('data-hasGroupFilters') == 'true' ) + { + $('#elGroupFilter').show(); + } + }, + + /** + * Toggle filtering by groups + * + * @param {event} e Event object + * @returns {void} + */ + toggleGroupFilter: function (e) { + e.preventDefault(); + + if( $('#elGroupFilter').is(':visible') ) + { + // If we are hiding the filter, we will assume they want to search everything and ensure all checkboxes are checked + $('#elGroupFilter').find('input[type="checkbox"]').prop('checked', true); + $('#elGroupFilter').slideUp(); + } + else + { + $('#elGroupFilter').slideDown(); + } + } + }); +}(jQuery, _)); + - - - - 1200 ) ? 1200 : d ).animate({ - opacity: 1 - }).removeAttr('data-new'); - }); - }); + // Now fade in one by one, with a delay + newItems.each( function (index) { + var d = ( index * delay ); + $( this ).delay( ( d > 1200 ) ? 1200 : d ).animate({ + opacity: 1 + }).removeAttr('data-new'); + }); }, /** @@ -43342,7 +45453,7 @@ var escapeRegExp; } }); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -43381,7 +45492,7 @@ var escapeRegExp; }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -43502,7 +45613,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -43528,7 +45639,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -43890,7 +46001,7 @@ var escapeRegExp; }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -44020,7 +46131,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -44753,7 +46864,7 @@ var escapeRegExp; }); }(jQuery, _)); - " + response + '
' ); - $( document ).trigger('contentChange', [ themeHookWindow ]); + .done( function (response) { + themeHookWindow.append( "
" + response + '
' ); + $( document ).trigger('contentChange', [ themeHookWindow.find('[data-template="' + templateName + '"]') ]); }) - .fail(function(){ + .fail( function () { window.location = target.attr('href'); }) + .always( function () { + themeHookWindow.removeClass('ipsLoading'); + }); } - target.addClass('cHookEditor_activeTemplate'); - themeHookWindow.removeClass('ipsLoading'); + target.closest('.ipsSideMenu_item').addClass('ipsSideMenu_itemActive'); } }); }(jQuery, _)); ]]>
- /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -44838,7 +46954,7 @@ var escapeRegExp; }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -44886,7 +47002,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -44984,7 +47100,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -45062,7 +47178,7 @@ var escapeRegExp; } }); }(jQuery, _)); - ').attr( 'data-role', 'validationCheck' ) ); this.emailField.after( $('').attr( 'data-role', 'validationCheck' ) ); @@ -45183,7 +47296,7 @@ var escapeRegExp; var resultElem = this.confirmPasswordField.next('[data-role="validationCheck"]'); if( this.passwordField.val() && this.passwordField.val() === this.confirmPasswordField.val() ){ - resultElem.show().html( ips.templates.render('core.forms.validateOk') ); + resultElem.hide().html(''); this.confirmPasswordField.removeClass('ipsField_error').addClass('ipsField_success'); } else { this._clearResult( this.confirmPasswordField ); @@ -45230,10 +47343,10 @@ var escapeRegExp; }) .done( function (response) { if( response.result == 'ok' ){ - resultElem.show().html( ips.templates.render('core.forms.validateOk') ); + resultElem.hide().html(''); field.removeClass('ipsField_error').addClass('ipsField_success'); } else { - resultElem.show().html( ips.templates.render( 'core.forms.validateFail', { message: response.message } ) ); + resultElem.show().html( ips.templates.render( 'core.forms.validateFailText', { message: response.message } ) ); field.removeClass('ipsField_success').addClass('ipsField_error'); } }) @@ -45244,7 +47357,7 @@ var escapeRegExp; } }); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -45294,7 +47407,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -45377,7 +47490,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -46795,7 +48909,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -48478,7 +50592,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - - \s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",f=a.console&&(a.console.warn||a.console.log);return f&&f.call(a.console,e,d),b.apply(this,arguments)}}function i(a,b,c){var d,e=b.prototype;d=a.prototype=Object.create(e),d.constructor=a,d._super=e,c&&la(d,c)}function j(a,b){return function(){return a.apply(b,arguments)}}function k(a,b){return typeof a==oa?a.apply(b?b[0]||d:d,b):a}function l(a,b){return a===d?b:a}function m(a,b,c){g(q(b),function(b){a.addEventListener(b,c,!1)})}function n(a,b,c){g(q(b),function(b){a.removeEventListener(b,c,!1)})}function o(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function p(a,b){return a.indexOf(b)>-1}function q(a){return a.trim().split(/\s+/g)}function r(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;dc[b]}):d.sort()),d}function u(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g1&&!c.firstMultiple?c.firstMultiple=D(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=E(d);b.timeStamp=ra(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=I(h,i),b.distance=H(h,i),B(c,b),b.offsetDirection=G(b.deltaX,b.deltaY);var j=F(b.deltaTime,b.deltaX,b.deltaY);b.overallVelocityX=j.x,b.overallVelocityY=j.y,b.overallVelocity=qa(j.x)>qa(j.y)?j.x:j.y,b.scale=g?K(g.pointers,d):1,b.rotation=g?J(g.pointers,d):0,b.maxPointers=c.prevInput?b.pointers.length>c.prevInput.maxPointers?b.pointers.length:c.prevInput.maxPointers:b.pointers.length,C(c,b);var k=a.element;o(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function B(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};b.eventType!==Ea&&f.eventType!==Ga||(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function C(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Ha&&(i>Da||h.velocity===d)){var j=b.deltaX-h.deltaX,k=b.deltaY-h.deltaY,l=F(i,j,k);e=l.x,f=l.y,c=qa(l.x)>qa(l.y)?l.x:l.y,g=G(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function D(a){for(var b=[],c=0;ce;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:pa(c/b),y:pa(d/b)}}function F(a,b,c){return{x:b/a||0,y:c/a||0}}function G(a,b){return a===b?Ia:qa(a)>=qa(b)?0>a?Ja:Ka:0>b?La:Ma}function H(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function I(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function J(a,b){return I(b[1],b[0],Ra)+I(a[1],a[0],Ra)}function K(a,b){return H(b[0],b[1],Ra)/H(a[0],a[1],Ra)}function L(){this.evEl=Ta,this.evWin=Ua,this.pressed=!1,x.apply(this,arguments)}function M(){this.evEl=Xa,this.evWin=Ya,x.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function N(){this.evTarget=$a,this.evWin=_a,this.started=!1,x.apply(this,arguments)}function O(a,b){var c=s(a.touches),d=s(a.changedTouches);return b&(Ga|Ha)&&(c=t(c.concat(d),"identifier",!0)),[c,d]}function P(){this.evTarget=bb,this.targetIds={},x.apply(this,arguments)}function Q(a,b){var c=s(a.touches),d=this.targetIds;if(b&(Ea|Fa)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=s(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return o(a.target,i)}),b===Ea)for(e=0;e-1&&d.splice(a,1)};setTimeout(e,cb)}}function U(a){for(var b=a.srcEvent.clientX,c=a.srcEvent.clientY,d=0;d=f&&db>=g)return!0}return!1}function V(a,b){this.manager=a,this.set(b)}function W(a){if(p(a,jb))return jb;var b=p(a,kb),c=p(a,lb);return b&&c?jb:b||c?b?kb:lb:p(a,ib)?ib:hb}function X(){if(!fb)return!1;var b={},c=a.CSS&&a.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(d){b[d]=c?a.CSS.supports("touch-action",d):!0}),b}function Y(a){this.options=la({},this.defaults,a||{}),this.id=v(),this.manager=null,this.options.enable=l(this.options.enable,!0),this.state=nb,this.simultaneous={},this.requireFail=[]}function Z(a){return a&sb?"cancel":a&qb?"end":a&pb?"move":a&ob?"start":""}function $(a){return a==Ma?"down":a==La?"up":a==Ja?"left":a==Ka?"right":""}function _(a,b){var c=b.manager;return c?c.get(a):a}function aa(){Y.apply(this,arguments)}function ba(){aa.apply(this,arguments),this.pX=null,this.pY=null}function ca(){aa.apply(this,arguments)}function da(){Y.apply(this,arguments),this._timer=null,this._input=null}function ea(){aa.apply(this,arguments)}function fa(){aa.apply(this,arguments)}function ga(){Y.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function ha(a,b){return b=b||{},b.recognizers=l(b.recognizers,ha.defaults.preset),new ia(a,b)}function ia(a,b){this.options=la({},ha.defaults,b||{}),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=a,this.input=y(this),this.touchAction=new V(this,this.options.touchAction),ja(this,!0),g(this.options.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function ja(a,b){var c=a.element;if(c.style){var d;g(a.options.cssProps,function(e,f){d=u(c.style,f),b?(a.oldCssProps[d]=c.style[d],c.style[d]=e):c.style[d]=a.oldCssProps[d]||""}),b||(a.oldCssProps={})}}function ka(a,c){var d=b.createEvent("Event");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var la,ma=["","webkit","Moz","MS","ms","o"],na=b.createElement("div"),oa="function",pa=Math.round,qa=Math.abs,ra=Date.now;la="function"!=typeof Object.assign?function(a){if(a===d||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;ch&&(b.push(a),h=b.length-1):e&(Ga|Ha)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Za={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},$a="touchstart",_a="touchstart touchmove touchend touchcancel";i(N,x,{handler:function(a){var b=Za[a.type];if(b===Ea&&(this.started=!0),this.started){var c=O.call(this,a,b);b&(Ga|Ha)&&c[0].length-c[1].length===0&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}}});var ab={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},bb="touchstart touchmove touchend touchcancel";i(P,x,{handler:function(a){var b=ab[a.type],c=Q.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}});var cb=2500,db=25;i(R,x,{handler:function(a,b,c){var d=c.pointerType==za,e=c.pointerType==Ba;if(!(e&&c.sourceCapabilities&&c.sourceCapabilities.firesTouchEvents)){if(d)S.call(this,b,c);else if(e&&U.call(this,c))return;this.callback(a,b,c)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var eb=u(na.style,"touchAction"),fb=eb!==d,gb="compute",hb="auto",ib="manipulation",jb="none",kb="pan-x",lb="pan-y",mb=X();V.prototype={set:function(a){a==gb&&(a=this.compute()),fb&&this.manager.element.style&&mb[a]&&(this.manager.element.style[eb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){k(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),W(a.join(" "))},preventDefaults:function(a){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=p(d,jb)&&!mb[jb],f=p(d,lb)&&!mb[lb],g=p(d,kb)&&!mb[kb];if(e){var h=1===a.pointers.length,i=a.distance<2,j=a.deltaTime<250;if(h&&i&&j)return}return g&&f?void 0:e||f&&c&Na||g&&c&Oa?this.preventSrc(b):void 0},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var nb=1,ob=2,pb=4,qb=8,rb=qb,sb=16,tb=32;Y.prototype={defaults:{},set:function(a){return la(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,"recognizeWith",this))return this;var b=this.simultaneous;return a=_(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,"dropRecognizeWith",this)?this:(a=_(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,"requireFailure",this))return this;var b=this.requireFail;return a=_(a,this),-1===r(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,"dropRequireFailure",this))return this;a=_(a,this);var b=r(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(b,a)}var c=this,d=this.state;qb>d&&b(c.options.event+Z(d)),b(c.options.event),a.additionalEvent&&b(a.additionalEvent),d>=qb&&b(c.options.event+Z(d))},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=tb)},canEmit:function(){for(var a=0;af?Ja:Ka,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Ia:0>g?La:Ma,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return aa.prototype.attrTest.call(this,a)&&(this.state&ob||!(this.state&ob)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=$(a.direction);b&&(a.additionalEvent=this.options.event+b),this._super.emit.call(this,a)}}),i(ca,aa,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&ob)},emit:function(a){if(1!==a.scale){var b=a.scale<1?"in":"out";a.additionalEvent=this.options.event+b}this._super.emit.call(this,a)}}),i(da,Y,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[hb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distanceb.time;if(this._input=a,!d||!c||a.eventType&(Ga|Ha)&&!f)this.reset();else if(a.eventType&Ea)this.reset(),this._timer=e(function(){this.state=rb,this.tryEmit()},b.time,this);else if(a.eventType&Ga)return rb;return tb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===rb&&(a&&a.eventType&Ga?this.manager.emit(this.options.event+"up",a):(this._input.timeStamp=ra(),this.manager.emit(this.options.event,this._input)))}}),i(ea,aa,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&ob)}}),i(fa,aa,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Na|Oa,pointers:1},getTouchAction:function(){return ba.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Na|Oa)?b=a.overallVelocity:c&Na?b=a.overallVelocityX:c&Oa&&(b=a.overallVelocityY),this._super.attrTest.call(this,a)&&c&a.offsetDirection&&a.distance>this.options.threshold&&a.maxPointers==this.options.pointers&&qa(b)>this.options.velocity&&a.eventType&Ga},emit:function(a){var b=$(a.offsetDirection);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),i(ga,Y,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[ib]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance + i;i++){var l=r.eq(i);if(t.append(l),n&&t.append(n),a(t,e)){l.remove(),o=!0;break}n&&n.detach()}return o}function r(e,n,i,d,l){var s=!1,c="a, table, thead, tbody, tfoot, tr, col, colgroup, object, embed, param, ol, ul, dl, blockquote, select, optgroup, option, textarea, script, style",u="script, .dotdotdot-keep";return e.contents().detach().each(function(){var h=this,f=t(h);if("undefined"==typeof h)return!0;if(f.is(u))e.append(f);else{if(s)return!0;e.append(f),!l||f.is(d.after)||f.find(d.after).length||e[e.is(c)?"after":"append"](l),a(i,d)&&(s=3==h.nodeType?o(f,n,i,d,l):r(f,n,i,d,l)),s||l&&l.detach()}}),n.addClass("is-truncated"),s}function o(e,n,r,o,d){var c=e[0];if(!c)return!1;var h=s(c),f=-1!==h.indexOf(" ")?" ":" ",p="letter"==o.wrap?"":f,g=h.split(p),v=-1,w=-1,b=0,m=g.length-1;for(o.fallbackToLetter&&0==b&&0==m&&(p="",g=h.split(p),m=g.length-1);m>=b&&(0!=b||0!=m);){var y=Math.floor((b+m)/2);if(y==w)break;w=y,l(c,g.slice(0,w+1).join(p)+o.ellipsis),r.children().each(function(){t(this).toggle().toggle()}),a(r,o)?(m=w,o.fallbackToLetter&&0==b&&0==m&&(p="",g=g[0].split(p),v=-1,w=-1,b=0,m=g.length-1)):(v=w,b=w)}if(-1==v||1==g.length&&0==g[0].length){var x=e.parent();e.detach();var C=d&&d.closest(x).length?d.length:0;if(x.contents().length>C?c=u(x.contents().eq(-1-C),n):(c=u(x,n,!0),C||x.detach()),c&&(h=i(s(c),o),l(c,h),C&&d)){var T=d.parent();t(c).parent().append(d),t.trim(T.html())||T.remove()}}else h=i(g.slice(0,v+1).join(p),o),l(c,h);return!0}function a(t,e){return t.innerHeight()>e.maxHeight}function i(e,n){for(;t.inArray(e.slice(-1),n.lastCharacter.remove)>-1;)e=e.slice(0,-1);return t.inArray(e.slice(-1),n.lastCharacter.noEllipsis)<0&&(e+=n.ellipsis),e}function d(t){return{width:t.innerWidth(),height:t.innerHeight()}}function l(t,e){t.innerText?t.innerText=e:t.nodeValue?t.nodeValue=e:t.textContent&&(t.textContent=e)}function s(t){return t.innerText?t.innerText:t.nodeValue?t.nodeValue:t.textContent?t.textContent:""}function c(t){do t=t.previousSibling;while(t&&1!==t.nodeType&&3!==t.nodeType);return t}function u(e,n,r){var o,a=e&&e[0];if(a){if(!r){if(3===a.nodeType)return a;if(t.trim(e.text()))return u(e.contents().last(),n)}for(o=c(a);!o;){if(e=e.parent(),e.is(n)||!e.length)return!1;o=c(e[0])}if(o)return u(t(o),n)}return!1}function h(e,n){return e?"string"==typeof e?(e=t(e,n),e.length?e:!1):e.jquery?e:!1:!1}function f(t){for(var e=t.innerHeight(),n=["paddingTop","paddingBottom"],r=0,o=n.length;o>r;r++){var a=parseInt(t.css(n[r]),10);isNaN(a)&&(a=0),e-=a}return e}if(!t.fn.dotdotdot){t.fn.dotdotdot=function(e){if(0==this.length)return t.fn.dotdotdot.debug('No element found for "'+this.selector+'".'),this;if(this.length>1)return this.each(function(){t(this).dotdotdot(e)});var o=this,i=o.contents();o.data("dotdotdot")&&o.trigger("destroy.dot"),o.data("dotdotdot-style",o.attr("style")||""),o.css("word-wrap","break-word"),"nowrap"===o.css("white-space")&&o.css("white-space","normal"),o.bind_events=function(){return o.bind("update.dot",function(e,d){switch(o.removeClass("is-truncated"),e.preventDefault(),e.stopPropagation(),typeof l.height){case"number":l.maxHeight=l.height;break;case"function":l.maxHeight=l.height.call(o[0]);break;default:l.maxHeight=f(o)}l.maxHeight+=l.tolerance,"undefined"!=typeof d&&(("string"==typeof d||"nodeType"in d&&1===d.nodeType)&&(d=t("
").append(d).contents()),d instanceof t&&(i=d)),g=o.wrapInner('
').children(),g.contents().detach().end().append(i.clone(!0)).find("br").replaceWith("
").end().css({height:"auto",width:"auto",border:"none",padding:0,margin:0});var c=!1,u=!1;return s.afterElement&&(c=s.afterElement.clone(!0),c.show(),s.afterElement.detach()),a(g,l)&&(u="children"==l.wrap?n(g,l,c):r(g,o,g,l,c)),g.replaceWith(g.contents()),g=null,t.isFunction(l.callback)&&l.callback.call(o[0],u,i),s.isTruncated=u,u}).bind("isTruncated.dot",function(t,e){return t.preventDefault(),t.stopPropagation(),"function"==typeof e&&e.call(o[0],s.isTruncated),s.isTruncated}).bind("originalContent.dot",function(t,e){return t.preventDefault(),t.stopPropagation(),"function"==typeof e&&e.call(o[0],i),i}).bind("destroy.dot",function(t){t.preventDefault(),t.stopPropagation(),o.unwatch().unbind_events().contents().detach().end().append(i).attr("style",o.data("dotdotdot-style")||"").removeClass("is-truncated").data("dotdotdot",!1)}),o},o.unbind_events=function(){return o.unbind(".dot"),o},o.watch=function(){if(o.unwatch(),"window"==l.watch){var e=t(window),n=e.width(),r=e.height();e.bind("resize.dot"+s.dotId,function(){n==e.width()&&r==e.height()&&l.windowResizeFix||(n=e.width(),r=e.height(),u&&clearInterval(u),u=setTimeout(function(){o.trigger("update.dot")},100))})}else c=d(o),u=setInterval(function(){if(o.is(":visible")){var t=d(o);c.width==t.width&&c.height==t.height||(o.trigger("update.dot"),c=t)}},500);return o},o.unwatch=function(){return t(window).unbind("resize.dot"+s.dotId),u&&clearInterval(u),o};var l=t.extend(!0,{},t.fn.dotdotdot.defaults,e),s={},c={},u=null,g=null;return l.lastCharacter.remove instanceof Array||(l.lastCharacter.remove=t.fn.dotdotdot.defaultArrays.lastCharacter.remove),l.lastCharacter.noEllipsis instanceof Array||(l.lastCharacter.noEllipsis=t.fn.dotdotdot.defaultArrays.lastCharacter.noEllipsis),s.afterElement=h(l.after,o),s.isTruncated=!1,s.dotId=p++,o.data("dotdotdot",!0).bind_events().trigger("update.dot"),l.watch&&o.watch(),o},t.fn.dotdotdot.defaults={ellipsis:"... ",wrap:"word",fallbackToLetter:!0,lastCharacter:{},tolerance:0,callback:null,after:null,height:null,watch:!1,windowResizeFix:!0},t.fn.dotdotdot.defaultArrays={lastCharacter:{remove:[" "," ",",",";",".","!","?"],noEllipsis:[]}},t.fn.dotdotdot.debug=function(t){};var p=1,g=t.fn.html;t.fn.html=function(n){return n!=e&&!t.isFunction(n)&&this.data("dotdotdot")?this.trigger("update",[n]):g.apply(this,arguments)};var v=t.fn.text;t.fn.text=function(n){return n!=e&&!t.isFunction(n)&&this.data("dotdotdot")?(n=t("
").text(n).html(),this.trigger("update",[n])):v.apply(this,arguments)}}}(jQuery),jQuery(document).ready(function(t){t(".dot-ellipsis").each(function(){var e=t(this).hasClass("dot-resize-update"),n=t(this).hasClass("dot-timer-update"),r=0,o=t(this).attr("class").split(/\s+/);t.each(o,function(t,e){var n=e.match(/^dot-height-(\d+)$/);null!==n&&(r=Number(n[1]))});var a=new Object;n&&(a.watch=!0),e&&(a.watch="window"),r>0&&(a.height=r),t(this).dotdotdot(a)})}),jQuery(window).on("load",function(){jQuery(".dot-ellipsis.dot-load-update").trigger("update.dot")});]]> - ")&&n[0]);return e>4?e:!1}();return e},h.isInternetExplorer=function(){var e=h.isInternetExplorer.cached=typeof h.isInternetExplorer.cached!="undefined"?h.isInternetExplorer.cached:Boolean(h.getInternetExplorerMajorVersion());return e},h.options.html4Mode?h.emulated={pushState:!0,hashChange:!0}:h.emulated={pushState:!Boolean(e.history&&e.history.pushState&&e.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(i.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(i.userAgent)),hashChange:Boolean(!("onhashchange"in e||"onhashchange"in r)||h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<8)},h.enabled=!h.emulated.pushState,h.bugs={setHash:Boolean(!h.emulated.pushState&&i.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)),safariPoll:Boolean(!h.emulated.pushState&&i.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)),ieDoubleCheck:Boolean(h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<7)},h.isEmptyObject=function(e){for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},h.cloneObject=function(e){var t,n;return e?(t=l.stringify(e),n=l.parse(t)):n={},n},h.getRootUrl=function(){var e=r.location.protocol+"//"+(r.location.hostname||r.location.host);if(r.location.port||!1)e+=":"+r.location.port;return e+="/",e},h.getBaseHref=function(){var e=r.getElementsByTagName("base"),t=null,n="";return e.length===1&&(t=e[0],n=t.href.replace(/[^\/]+$/,"")),n=n.replace(/\/+$/,""),n&&(n+="/"),n},h.getBaseUrl=function(){var e=h.getBaseHref()||h.getBasePageUrl()||h.getRootUrl();return e},h.getPageUrl=function(){var e=h.getState(!1,!1),t=(e||{}).url||h.getLocationHref(),n;return n=t.replace(/\/+$/,"").replace(/[^\/]+$/,function(e,t,n){return/\./.test(e)?e:e+"/"}),n},h.getBasePageUrl=function(){var e=h.getLocationHref().replace(/[#\?].*/,"").replace(/[^\/]+$/,function(e,t,n){return/[^\/]$/.test(e)?"":e}).replace(/\/+$/,"")+"/";return e},h.getFullUrl=function(e,t){var n=e,r=e.substring(0,1);return t=typeof t=="undefined"?!0:t,/[a-z]+\:\/\//.test(e)||(r==="/"?n=h.getRootUrl()+e.replace(/^\/+/,""):r==="#"?n=h.getPageUrl().replace(/#.*/,"")+e:r==="?"?n=h.getPageUrl().replace(/[\?#].*/,"")+e:t?n=h.getBaseUrl()+e.replace(/^(\.\/)+/,""):n=h.getBasePageUrl()+e.replace(/^(\.\/)+/,"")),n.replace(/\#$/,"")},h.getShortUrl=function(e){var t=e,n=h.getBaseUrl(),r=h.getRootUrl();return h.emulated.pushState&&(t=t.replace(n,"")),t=t.replace(r,"/"),h.isTraditionalAnchor(t)&&(t="./"+t),t=t.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),t},h.getLocationHref=function(e){return e=e||r,e.URL===e.location.href?e.location.href:e.location.href===decodeURIComponent(e.URL)?e.URL:e.location.hash&&decodeURIComponent(e.location.href.replace(/^[^#]+/,""))===e.location.hash?e.location.href:e.URL.indexOf("#")==-1&&e.location.href.indexOf("#")!=-1?e.location.href:e.URL||e.location.href},h.store={},h.idToState=h.idToState||{},h.stateToId=h.stateToId||{},h.urlToId=h.urlToId||{},h.storedStates=h.storedStates||[],h.savedStates=h.savedStates||[],h.normalizeStore=function(){h.store.idToState=h.store.idToState||{},h.store.urlToId=h.store.urlToId||{},h.store.stateToId=h.store.stateToId||{}},h.getState=function(e,t){typeof e=="undefined"&&(e=!0),typeof t=="undefined"&&(t=!0);var n=h.getLastSavedState();return!n&&t&&(n=h.createStateObject()),e&&(n=h.cloneObject(n),n.url=n.cleanUrl||n.url),n},h.getIdByState=function(e){var t=h.extractId(e.url),n;if(!t){n=h.getStateString(e);if(typeof h.stateToId[n]!="undefined")t=h.stateToId[n];else if(typeof h.store.stateToId[n]!="undefined")t=h.store.stateToId[n];else{for(;;){t=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof h.idToState[t]=="undefined"&&typeof h.store.idToState[t]=="undefined")break}h.stateToId[n]=t,h.idToState[t]=e}}return t},h.normalizeState=function(e){var t,n;if(!e||typeof e!="object")e={};if(typeof e.normalized!="undefined")return e;if(!e.data||typeof e.data!="object")e.data={};return t={},t.normalized=!0,t.title=e.title||"",t.url=h.getFullUrl(e.url?e.url:h.getLocationHref()),t.hash=h.getShortUrl(t.url),t.data=h.cloneObject(e.data),t.id=h.getIdByState(t),t.cleanUrl=t.url.replace(/\??\&_suid.*/,""),t.url=t.cleanUrl,n=!h.isEmptyObject(t.data),(t.title||n)&&h.options.disableSuid!==!0&&(t.hash=h.getShortUrl(t.url).replace(/\??\&_suid.*/,""),/\?/.test(t.hash)||(t.hash+="?"),t.hash+="&_suid="+t.id),t.hashedUrl=h.getFullUrl(t.hash),(h.emulated.pushState||h.bugs.safariPoll)&&h.hasUrlDuplicate(t)&&(t.url=t.hashedUrl),t},h.createStateObject=function(e,t,n){var r={data:e,title:t,url:n};return r=h.normalizeState(r),r},h.getStateById=function(e){e=String(e);var n=h.idToState[e]||h.store.idToState[e]||t;return n},h.getStateString=function(e){var t,n,r;return t=h.normalizeState(e),n={data:t.data,title:e.title,url:e.url},r=l.stringify(n),r},h.getStateId=function(e){var t,n;return t=h.normalizeState(e),n=t.id,n},h.getHashByState=function(e){var t,n;return t=h.normalizeState(e),n=t.hash,n},h.extractId=function(e){var t,n,r,i;return e.indexOf("#")!=-1?i=e.split("#")[0]:i=e,n=/(.*)\&_suid=([0-9]+)$/.exec(i),r=n?n[1]||e:e,t=n?String(n[2]||""):"",t||!1},h.isTraditionalAnchor=function(e){var t=!/[\/\?\.]/.test(e);return t},h.extractState=function(e,t){var n=null,r,i;return t=t||!1,r=h.extractId(e),r&&(n=h.getStateById(r)),n||(i=h.getFullUrl(e),r=h.getIdByUrl(i)||!1,r&&(n=h.getStateById(r)),!n&&t&&!h.isTraditionalAnchor(e)&&(n=h.createStateObject(null,null,i))),n},h.getIdByUrl=function(e){var n=h.urlToId[e]||h.store.urlToId[e]||t;return n},h.getLastSavedState=function(){return h.savedStates[h.savedStates.length-1]||t},h.getLastStoredState=function(){return h.storedStates[h.storedStates.length-1]||t},h.hasUrlDuplicate=function(e){var t=!1,n;return n=h.extractState(e.url),t=n&&n.id!==e.id,t},h.storeState=function(e){return h.urlToId[e.url]=e.id,h.storedStates.push(h.cloneObject(e)),e},h.isLastSavedState=function(e){var t=!1,n,r,i;return h.savedStates.length&&(n=e.id,r=h.getLastSavedState(),i=r.id,t=n===i),t},h.saveState=function(e){return h.isLastSavedState(e)?!1:(h.savedStates.push(h.cloneObject(e)),!0)},h.getStateByIndex=function(e){var t=null;return typeof e=="undefined"?t=h.savedStates[h.savedStates.length-1]:e<0?t=h.savedStates[h.savedStates.length+e]:t=h.savedStates[e],t},h.getCurrentIndex=function(){var e=null;return h.savedStates.length<1?e=0:e=h.savedStates.length-1,e},h.getHash=function(e){var t=h.getLocationHref(e),n;return n=h.getHashByUrl(t),n},h.unescapeHash=function(e){var t=h.normalizeHash(e);return t=decodeURIComponent(t),t},h.normalizeHash=function(e){var t=e.replace(/[^#]*#/,"").replace(/#.*/,"");return t},h.setHash=function(e,t){var n,i;return t!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.setHash,args:arguments,queue:t}),!1):(h.busy(!0),n=h.extractState(e,!0),n&&!h.emulated.pushState?h.pushState(n.data,n.title,n.url,!1):h.getHash()!==e&&(h.bugs.setHash?(i=h.getPageUrl(),h.pushState(null,null,i+"#"+e,!1)):r.location.hash=e),h)},h.escapeHash=function(t){var n=h.normalizeHash(t);return n=e.encodeURIComponent(n),h.bugs.hashEscape||(n=n.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),n},h.getHashByUrl=function(e){var t=String(e).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return t=h.unescapeHash(t),t},h.setTitle=function(e){var t=e.title,n;t||(n=h.getStateByIndex(0),n&&n.url===e.url&&(t=n.title||h.options.initialTitle));try{r.getElementsByTagName("title")[0].innerHTML=t.replace("<","<").replace(">",">").replace(" & "," & ")}catch(i){}return r.title=t,h},h.queues=[],h.busy=function(e){typeof e!="undefined"?h.busy.flag=e:typeof h.busy.flag=="undefined"&&(h.busy.flag=!1);if(!h.busy.flag){u(h.busy.timeout);var t=function(){var e,n,r;if(h.busy.flag)return;for(e=h.queues.length-1;e>=0;--e){n=h.queues[e];if(n.length===0)continue;r=n.shift(),h.fireQueueItem(r),h.busy.timeout=o(t,h.options.busyDelay)}};h.busy.timeout=o(t,h.options.busyDelay)}return h.busy.flag},h.busy.flag=!1,h.fireQueueItem=function(e){return e.callback.apply(e.scope||h,e.args||[])},h.pushQueue=function(e){return h.queues[e.queue||0]=h.queues[e.queue||0]||[],h.queues[e.queue||0].push(e),h},h.queue=function(e,t){return typeof e=="function"&&(e={callback:e}),typeof t!="undefined"&&(e.queue=t),h.busy()?h.pushQueue(e):h.fireQueueItem(e),h},h.clearQueue=function(){return h.busy.flag=!1,h.queues=[],h},h.stateChanged=!1,h.doubleChecker=!1,h.doubleCheckComplete=function(){return h.stateChanged=!0,h.doubleCheckClear(),h},h.doubleCheckClear=function(){return h.doubleChecker&&(u(h.doubleChecker),h.doubleChecker=!1),h},h.doubleCheck=function(e){return h.stateChanged=!1,h.doubleCheckClear(),h.bugs.ieDoubleCheck&&(h.doubleChecker=o(function(){return h.doubleCheckClear(),h.stateChanged||e(),!0},h.options.doubleCheckInterval)),h},h.safariStatePoll=function(){var t=h.extractState(h.getLocationHref()),n;if(!h.isLastSavedState(t))return n=t,n||(n=h.createStateObject()),h.Adapter.trigger(e,"popstate"),h;return},h.back=function(e){return e!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.back,args:arguments,queue:e}),!1):(h.busy(!0),h.doubleCheck(function(){h.back(!1)}),p.go(-1),!0)},h.forward=function(e){return e!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.forward,args:arguments,queue:e}),!1):(h.busy(!0),h.doubleCheck(function(){h.forward(!1)}),p.go(1),!0)},h.go=function(e,t){var n;if(e>0)for(n=1;n<=e;++n)h.forward(t);else{if(!(e<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(n=-1;n>=e;--n)h.back(t)}return h};if(h.emulated.pushState){var v=function(){};h.pushState=h.pushState||v,h.replaceState=h.replaceState||v}else h.onPopState=function(t,n){var r=!1,i=!1,s,o;return h.doubleCheckComplete(),s=h.getHash(),s?(o=h.extractState(s||h.getLocationHref(),!0),o?h.replaceState(o.data,o.title,o.url,!1):(h.Adapter.trigger(e,"anchorchange"),h.busy(!1)),h.expectedStateId=!1,!1):(r=h.Adapter.extractEventData("state",t,n)||!1,r?i=h.getStateById(r):h.expectedStateId?i=h.getStateById(h.expectedStateId):i=h.extractState(h.getLocationHref()),i||(i=h.createStateObject(null,null,h.getLocationHref())),h.expectedStateId=!1,h.isLastSavedState(i)?(h.busy(!1),!1):(h.storeState(i),h.saveState(i),h.setTitle(i),h.Adapter.trigger(e,"statechange"),h.busy(!1),!0))},h.Adapter.bind(e,"popstate",h.onPopState),h.pushState=function(t,n,r,i){if(h.getHashByUrl(r)&&h.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(i!==!1&&h.busy())return h.pushQueue({scope:h,callback:h.pushState,args:arguments,queue:i}),!1;h.busy(!0);var s=h.createStateObject(t,n,r);return h.isLastSavedState(s)?h.busy(!1):(h.storeState(s),h.expectedStateId=s.id,p.pushState(s.id,s.title,s.url),h.Adapter.trigger(e,"popstate")),!0},h.replaceState=function(t,n,r,i){if(h.getHashByUrl(r)&&h.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(i!==!1&&h.busy())return h.pushQueue({scope:h,callback:h.replaceState,args:arguments,queue:i}),!1;h.busy(!0);var s=h.createStateObject(t,n,r);return h.isLastSavedState(s)?h.busy(!1):(h.storeState(s),h.expectedStateId=s.id,p.replaceState(s.id,s.title,s.url),h.Adapter.trigger(e,"popstate")),!0};if(s){try{h.store=l.parse(s.getItem("History.store"))||{}}catch(m){h.store={}}h.normalizeStore()}else h.store={},h.normalizeStore();h.Adapter.bind(e,"unload",h.clearAllIntervals),h.saveState(h.storeState(h.extractState(h.getLocationHref(),!0))),s&&(h.onUnload=function(){var e,t,n;try{e=l.parse(s.getItem("History.store"))||{}}catch(r){e={}}e.idToState=e.idToState||{},e.urlToId=e.urlToId||{},e.stateToId=e.stateToId||{};for(t in h.idToState){if(!h.idToState.hasOwnProperty(t))continue;e.idToState[t]=h.idToState[t]}for(t in h.urlToId){if(!h.urlToId.hasOwnProperty(t))continue;e.urlToId[t]=h.urlToId[t]}for(t in h.stateToId){if(!h.stateToId.hasOwnProperty(t))continue;e.stateToId[t]=h.stateToId[t]}h.store=e,h.normalizeStore(),n=l.stringify(e);try{s.setItem("History.store",n)}catch(i){if(i.code!==DOMException.QUOTA_EXCEEDED_ERR)throw i;s.length&&(s.removeItem("History.store"),s.setItem("History.store",n))}},h.intervalList.push(a(h.onUnload,h.options.storeInterval)),h.Adapter.bind(e,"beforeunload",h.onUnload),h.Adapter.bind(e,"unload",h.onUnload));if(!h.emulated.pushState){h.bugs.safariPoll&&h.intervalList.push(a(h.safariStatePoll,h.options.safariPollInterval));if(i.vendor==="Apple Computer, Inc."||(i.appCodeName||"")==="Mozilla")h.Adapter.bind(e,"hashchange",function(){h.Adapter.trigger(e,"popstate")}),h.getHash()&&h.Adapter.onDomLoad(function(){h.Adapter.trigger(e,"hashchange")})}},(!h.options||!h.options.delayInit)&&h.init()}(window)]]> - ")&&n[0]);return e>4?e:!1}();return e},h.isInternetExplorer=function(){var e=h.isInternetExplorer.cached=typeof h.isInternetExplorer.cached!="undefined"?h.isInternetExplorer.cached:Boolean(h.getInternetExplorerMajorVersion());return e},h.options.html4Mode?h.emulated={pushState:!0,hashChange:!0}:h.emulated={pushState:!Boolean(e.history&&e.history.pushState&&e.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(i.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(i.userAgent)),hashChange:Boolean(!("onhashchange"in e||"onhashchange"in r)||h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<8)},h.enabled=!h.emulated.pushState,h.bugs={setHash:Boolean(!h.emulated.pushState&&i.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)),safariPoll:Boolean(!h.emulated.pushState&&i.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)),ieDoubleCheck:Boolean(h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<7)},h.isEmptyObject=function(e){for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},h.cloneObject=function(e){var t,n;return e?(t=l.stringify(e),n=l.parse(t)):n={},n},h.getRootUrl=function(){var e=r.location.protocol+"//"+(r.location.hostname||r.location.host);if(r.location.port||!1)e+=":"+r.location.port;return e+="/",e},h.getBaseHref=function(){var e=r.getElementsByTagName("base"),t=null,n="";return e.length===1&&(t=e[0],n=t.href.replace(/[^\/]+$/,"")),n=n.replace(/\/+$/,""),n&&(n+="/"),n},h.getBaseUrl=function(){var e=h.getBaseHref()||h.getBasePageUrl()||h.getRootUrl();return e},h.getPageUrl=function(){var e=h.getState(!1,!1),t=(e||{}).url||h.getLocationHref(),n;return n=t.replace(/\/+$/,"").replace(/[^\/]+$/,function(e,t,n){return/\./.test(e)?e:e+"/"}),n},h.getBasePageUrl=function(){var e=h.getLocationHref().replace(/[#\?].*/,"").replace(/[^\/]+$/,function(e,t,n){return/[^\/]$/.test(e)?"":e}).replace(/\/+$/,"")+"/";return e},h.getFullUrl=function(e,t){var n=e,r=e.substring(0,1);return t=typeof t=="undefined"?!0:t,/[a-z]+\:\/\//.test(e)||(r==="/"?n=h.getRootUrl()+e.replace(/^\/+/,""):r==="#"?n=h.getPageUrl().replace(/#.*/,"")+e:r==="?"?n=h.getPageUrl().replace(/[\?#].*/,"")+e:t?n=h.getBaseUrl()+e.replace(/^(\.\/)+/,""):n=h.getBasePageUrl()+e.replace(/^(\.\/)+/,"")),n.replace(/\#$/,"")},h.getShortUrl=function(e){var t=e,n=h.getBaseUrl(),r=h.getRootUrl();return h.emulated.pushState&&(t=t.replace(n,"")),t=t.replace(r,"/"),h.isTraditionalAnchor(t)&&(t="./"+t),t=t.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),t},h.getLocationHref=function(e){return e=e||r,e.URL===e.location.href?e.location.href:e.location.href===decodeURIComponent(e.URL)?e.URL:e.location.hash&&decodeURIComponent(e.location.href.replace(/^[^#]+/,""))===e.location.hash?e.location.href:e.URL.indexOf("#")==-1&&e.location.href.indexOf("#")!=-1?e.location.href:e.URL||e.location.href},h.store={},h.idToState=h.idToState||{},h.stateToId=h.stateToId||{},h.urlToId=h.urlToId||{},h.storedStates=h.storedStates||[],h.savedStates=h.savedStates||[],h.normalizeStore=function(){h.store.idToState=h.store.idToState||{},h.store.urlToId=h.store.urlToId||{},h.store.stateToId=h.store.stateToId||{}},h.getState=function(e,t){typeof e=="undefined"&&(e=!0),typeof t=="undefined"&&(t=!0);var n=h.getLastSavedState();return!n&&t&&(n=h.createStateObject()),e&&(n=h.cloneObject(n),n.url=n.cleanUrl||n.url),n},h.getIdByState=function(e){var t=h.extractId(e.url),n;if(!t){n=h.getStateString(e);if(typeof h.stateToId[n]!="undefined")t=h.stateToId[n];else if(typeof h.store.stateToId[n]!="undefined")t=h.store.stateToId[n];else{for(;;){t=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof h.idToState[t]=="undefined"&&typeof h.store.idToState[t]=="undefined")break}h.stateToId[n]=t,h.idToState[t]=e}}return t},h.normalizeState=function(e){var t,n;if(!e||typeof e!="object")e={};if(typeof e.normalized!="undefined")return e;if(!e.data||typeof e.data!="object")e.data={};return t={},t.normalized=!0,t.title=e.title||"",t.url=h.getFullUrl(e.url?e.url:h.getLocationHref()),t.hash=h.getShortUrl(t.url),t.data=h.cloneObject(e.data),t.id=h.getIdByState(t),t.cleanUrl=t.url.replace(/\??\&_suid.*/,""),t.url=t.cleanUrl,n=!h.isEmptyObject(t.data),(t.title||n)&&h.options.disableSuid!==!0&&(t.hash=h.getShortUrl(t.url).replace(/\??\&_suid.*/,""),/\?/.test(t.hash)||(t.hash+="?"),t.hash+="&_suid="+t.id),t.hashedUrl=h.getFullUrl(t.hash),(h.emulated.pushState||h.bugs.safariPoll)&&h.hasUrlDuplicate(t)&&(t.url=t.hashedUrl),t},h.createStateObject=function(e,t,n){var r={data:e,title:t,url:n};return r=h.normalizeState(r),r},h.getStateById=function(e){e=String(e);var n=h.idToState[e]||h.store.idToState[e]||t;return n},h.getStateString=function(e){var t,n,r;return t=h.normalizeState(e),n={data:t.data,title:e.title,url:e.url},r=l.stringify(n),r},h.getStateId=function(e){var t,n;return t=h.normalizeState(e),n=t.id,n},h.getHashByState=function(e){var t,n;return t=h.normalizeState(e),n=t.hash,n},h.extractId=function(e){var t,n,r,i;return e.indexOf("#")!=-1?i=e.split("#")[0]:i=e,n=/(.*)\&_suid=([0-9]+)$/.exec(i),r=n?n[1]||e:e,t=n?String(n[2]||""):"",t||!1},h.isTraditionalAnchor=function(e){var t=!/[\/\?\.]/.test(e);return t},h.extractState=function(e,t){var n=null,r,i;return t=t||!1,r=h.extractId(e),r&&(n=h.getStateById(r)),n||(i=h.getFullUrl(e),r=h.getIdByUrl(i)||!1,r&&(n=h.getStateById(r)),!n&&t&&!h.isTraditionalAnchor(e)&&(n=h.createStateObject(null,null,i))),n},h.getIdByUrl=function(e){var n=h.urlToId[e]||h.store.urlToId[e]||t;return n},h.getLastSavedState=function(){return h.savedStates[h.savedStates.length-1]||t},h.getLastStoredState=function(){return h.storedStates[h.storedStates.length-1]||t},h.hasUrlDuplicate=function(e){var t=!1,n;return n=h.extractState(e.url),t=n&&n.id!==e.id,t},h.storeState=function(e){return h.urlToId[e.url]=e.id,h.storedStates.push(h.cloneObject(e)),e},h.isLastSavedState=function(e){var t=!1,n,r,i;return h.savedStates.length&&(n=e.id,r=h.getLastSavedState(),i=r.id,t=n===i),t},h.saveState=function(e){return h.isLastSavedState(e)?!1:(h.savedStates.push(h.cloneObject(e)),!0)},h.getStateByIndex=function(e){var t=null;return typeof e=="undefined"?t=h.savedStates[h.savedStates.length-1]:e<0?t=h.savedStates[h.savedStates.length+e]:t=h.savedStates[e],t},h.getCurrentIndex=function(){var e=null;return h.savedStates.length<1?e=0:e=h.savedStates.length-1,e},h.getHash=function(e){var t=h.getLocationHref(e),n;return n=h.getHashByUrl(t),n},h.unescapeHash=function(e){var t=h.normalizeHash(e);return t=decodeURIComponent(t),t},h.normalizeHash=function(e){var t=e.replace(/[^#]*#/,"").replace(/#.*/,"");return t},h.setHash=function(e,t){var n,i;return t!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.setHash,args:arguments,queue:t}),!1):(h.busy(!0),n=h.extractState(e,!0),n&&!h.emulated.pushState?h.pushState(n.data,n.title,n.url,!1):h.getHash()!==e&&(h.bugs.setHash?(i=h.getPageUrl(),h.pushState(null,null,i+"#"+e,!1)):r.location.hash=e),h)},h.escapeHash=function(t){var n=h.normalizeHash(t);return n=e.encodeURIComponent(n),h.bugs.hashEscape||(n=n.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),n},h.getHashByUrl=function(e){var t=String(e).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return t=h.unescapeHash(t),t},h.setTitle=function(e){var t=e.title,n;t||(n=h.getStateByIndex(0),n&&n.url===e.url&&(t=n.title||h.options.initialTitle));try{r.getElementsByTagName("title")[0].innerHTML=t.replace("<","<").replace(">",">").replace(" & "," & ")}catch(i){}return r.title=t,h},h.queues=[],h.busy=function(e){typeof e!="undefined"?h.busy.flag=e:typeof h.busy.flag=="undefined"&&(h.busy.flag=!1);if(!h.busy.flag){u(h.busy.timeout);var t=function(){var e,n,r;if(h.busy.flag)return;for(e=h.queues.length-1;e>=0;--e){n=h.queues[e];if(n.length===0)continue;r=n.shift(),h.fireQueueItem(r),h.busy.timeout=o(t,h.options.busyDelay)}};h.busy.timeout=o(t,h.options.busyDelay)}return h.busy.flag},h.busy.flag=!1,h.fireQueueItem=function(e){return e.callback.apply(e.scope||h,e.args||[])},h.pushQueue=function(e){return h.queues[e.queue||0]=h.queues[e.queue||0]||[],h.queues[e.queue||0].push(e),h},h.queue=function(e,t){return typeof e=="function"&&(e={callback:e}),typeof t!="undefined"&&(e.queue=t),h.busy()?h.pushQueue(e):h.fireQueueItem(e),h},h.clearQueue=function(){return h.busy.flag=!1,h.queues=[],h},h.stateChanged=!1,h.doubleChecker=!1,h.doubleCheckComplete=function(){return h.stateChanged=!0,h.doubleCheckClear(),h},h.doubleCheckClear=function(){return h.doubleChecker&&(u(h.doubleChecker),h.doubleChecker=!1),h},h.doubleCheck=function(e){return h.stateChanged=!1,h.doubleCheckClear(),h.bugs.ieDoubleCheck&&(h.doubleChecker=o(function(){return h.doubleCheckClear(),h.stateChanged||e(),!0},h.options.doubleCheckInterval)),h},h.safariStatePoll=function(){var t=h.extractState(h.getLocationHref()),n;if(!h.isLastSavedState(t))return n=t,n||(n=h.createStateObject()),h.Adapter.trigger(e,"popstate"),h;return},h.back=function(e){return e!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.back,args:arguments,queue:e}),!1):(h.busy(!0),h.doubleCheck(function(){h.back(!1)}),p.go(-1),!0)},h.forward=function(e){return e!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.forward,args:arguments,queue:e}),!1):(h.busy(!0),h.doubleCheck(function(){h.forward(!1)}),p.go(1),!0)},h.go=function(e,t){var n;if(e>0)for(n=1;n<=e;++n)h.forward(t);else{if(!(e<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(n=-1;n>=e;--n)h.back(t)}return h};if(h.emulated.pushState){var v=function(){};h.pushState=h.pushState||v,h.replaceState=h.replaceState||v}else h.onPopState=function(t,n){var r=!1,i=!1,s,o;return h.doubleCheckComplete(),s=h.getHash(),s?(o=h.extractState(s||h.getLocationHref(),!0),o?h.replaceState(o.data,o.title,o.url,!1):(h.Adapter.trigger(e,"anchorchange"),h.busy(!1)),h.expectedStateId=!1,!1):(r=h.Adapter.extractEventData("state",t,n)||!1,r?i=h.getStateById(r):h.expectedStateId?i=h.getStateById(h.expectedStateId):i=h.extractState(h.getLocationHref()),i||(i=h.createStateObject(null,null,h.getLocationHref())),h.expectedStateId=!1,h.isLastSavedState(i)?(h.busy(!1),!1):(h.storeState(i),h.saveState(i),h.setTitle(i),h.Adapter.trigger(e,"statechange"),h.busy(!1),!0))},h.Adapter.bind(e,"popstate",h.onPopState),h.pushState=function(t,n,r,i){if(h.getHashByUrl(r)&&h.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(i!==!1&&h.busy())return h.pushQueue({scope:h,callback:h.pushState,args:arguments,queue:i}),!1;h.busy(!0);var s=h.createStateObject(t,n,r);return h.isLastSavedState(s)?h.busy(!1):(h.storeState(s),h.expectedStateId=s.id,p.pushState(s.id,s.title,s.url),h.Adapter.trigger(e,"popstate")),!0},h.replaceState=function(t,n,r,i){if(h.getHashByUrl(r)&&h.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(i!==!1&&h.busy())return h.pushQueue({scope:h,callback:h.replaceState,args:arguments,queue:i}),!1;h.busy(!0);var s=h.createStateObject(t,n,r);return h.isLastSavedState(s)?h.busy(!1):(h.storeState(s),h.expectedStateId=s.id,p.replaceState(s.id,s.title,s.url),h.Adapter.trigger(e,"popstate")),!0};if(s){try{h.store=l.parse(s.getItem("History.store"))||{}}catch(m){h.store={}}h.normalizeStore()}else h.store={},h.normalizeStore();h.Adapter.bind(e,"unload",h.clearAllIntervals),h.saveState(h.storeState(h.extractState(h.getLocationHref(),!0))),s&&(h.onUnload=function(){var e,t,n;try{e=l.parse(s.getItem("History.store"))||{}}catch(r){e={}}e.idToState=e.idToState||{},e.urlToId=e.urlToId||{},e.stateToId=e.stateToId||{};for(t in h.idToState){if(!h.idToState.hasOwnProperty(t))continue;e.idToState[t]=h.idToState[t]}for(t in h.urlToId){if(!h.urlToId.hasOwnProperty(t))continue;e.urlToId[t]=h.urlToId[t]}for(t in h.stateToId){if(!h.stateToId.hasOwnProperty(t))continue;e.stateToId[t]=h.stateToId[t]}h.store=e,h.normalizeStore(),n=l.stringify(e);try{s.setItem("History.store",n)}catch(i){if(i.code!==DOMException.QUOTA_EXCEEDED_ERR)throw i;s.length&&(s.removeItem("History.store"),s.setItem("History.store",n))}},h.intervalList.push(a(h.onUnload,h.options.storeInterval)),h.Adapter.bind(e,"beforeunload",h.onUnload),h.Adapter.bind(e,"unload",h.onUnload));if(!h.emulated.pushState){h.bugs.safariPoll&&h.intervalList.push(a(h.safariStatePoll,h.options.safariPollInterval));if(i.vendor==="Apple Computer, Inc."||(i.appCodeName||"")==="Mozilla")h.Adapter.bind(e,"hashchange",function(){h.Adapter.trigger(e,"popstate")}),h.getHash()&&h.Adapter.onDomLoad(function(){h.Adapter.trigger(e,"hashchange")})}},(!h.options||!h.options.delayInit)&&h.init()}(window)]]> + - - a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; }catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("]]> - - + - - @@ -2723,15 +3321,19 @@
{{endif}}]]> -